package page.tools.admin;

import java.io.IOException;

import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;

import page.tools.entity.Browser;
import page.tools.entity.User;

import static org.wikiwebserver.html.HTMLHelper.*;


public class QuickSignIn implements HTTPResponder {
    
    // This form will feature on all pages, must not conflict with other forms
    private String formUnique = "QSI";
    
    public Object respond(HTTPHandler conn) throws IOException {
        
        String error = null;
        String email = null;
        String password = null;
        String emailClass = "email";
        String passwordClass = "password";
        
        String cookieImplants = null;
        
        String rl = conn.getRequest().getUrl();        
        
        FormData formData = conn.getRequest().getFormData();
        if (formData != null) {
            String action = formData.getFirst(formUnique + "action");
            email = formData.getFirst(formUnique + "email");
            password = formData.getFirst(formUnique + "password");  
            if (action == null) {
                // Ignore
            }
            else if (action.equals("Reset")) {
                String userID = formData.getFirst(formUnique + "userID");
                User user = User.getUserById(userID);
                if (user != null) {
                    user.resetPassword(conn);
                    error = "Check email for new temporary password";
                }
            }
            else if (action.equals("Sign in")) {
                User user = User.getUserByEmail(email);
                if (user == null) {
                    emailClass += "Error";
                    String register = WareHouse.getUrlPathForClass(UserProfile.class) +
                                      "?completetarget=" + conn.getRequest().getUrl();
                    
                    error = "<span class='error'>Account not found.</span> " +
                    		a(register, "Register a new user account") + ".";                     
                }
                else if (!user.isCorrectPassword(password)) {
                    passwordClass += "Error";
                    String tempPasswordLink = rl + "?" + formUnique + "action=" + "Reset" +
                                              "&" + formUnique + "userID=" + user.getId();
                    error = "<span class='error'>Incorrect password.</span> " +
                    		a(tempPasswordLink, "Email a new one") +
                    		" to " + email + ".";                                         
                }
                else {
                    user.startSession(password, conn);
                    cookieImplants = implantCookie(user, "http://www.wikiwebserver.org", "Signed into WikiWebServer") +           
                                     implantCookie(user, "http://www.googleoids.com", "Signed into Googleoids") +
                                     implantCookie(user, "http://www.jfilerecovery.com", "Signed into JFileRecovery");       
                }
                // This was a sign in attempt, remove form data
                conn.getRequest().getFormData().clear();
            }   
            else if (action.equals("Sign out")) {
                User user = User.getUser(conn.getRequest());
                user.endSession(conn.getRequest(), conn.getResponse());
                // This was a sign out attempt, remove form data
                conn.getRequest().getFormData().clear();
            }
        }
        
        
        StringBuilder form = new StringBuilder();    
        
        User currentUser = null;
        try {
            currentUser = User.getUser(conn.getRequest());
        } catch (SecurityException ex) {  /* Occurs if session bad */ }
        
        if (currentUser == null) {
            String userID = conn.getRequest().getHeaders().getRequestCookies().get("userID");
            if (email == null) email = "guest@wikiwebserver.org";
            if (password == null) password = "********";
            if (userID != null) {
                User u = User.getUserById(userID);
                if (u != null) {
                    email = u.getEmail();
                    password = "";
                }
            }
            form.append(textfield(formUnique+"email", email, "onfocus='this.select();' class='" + emailClass + "'"));
            form.append(textfield(formUnique+"password", password, "onfocus='this.select();' class='" + passwordClass + "'"));
            form.append(submitbutton(formUnique + "action", "Sign in"));
        }
        else {
            if (cookieImplants != null) {
                form.append(cookieImplants);
            }
            form.append(submitbutton(formUnique + "action", "Sign out"));
        }
        


        StringBuilder body = new StringBuilder();        
        body.append(div(ContainerType.CLASS, "signin", form.toString()));
        
        if (error != null) {
            body.append(error);
        }        
        else if (currentUser == null) {
            Browser browser = Browser.getBrowser(conn);
            if (browser == null) {
                body.append("Welcome, no valid cookie found, try a page " +
                        a("JavaScript:location.reload(true);", "refresh") + "."); 
            } else {
                body.append("Welcome "); 
                String details = WareHouse.getUrlPathForClass(page.tools.stats.BrowserInfo.class)
                            + "?browserID=" + browser.getId();
                body.append(a(details, "guest") + ", please sign in or "); 
                String register = WareHouse.getUrlPathForClass(page.tools.admin.UserProfile.class) +
                                  "?completetarget=" + conn.getRequest().getUrl();
                body.append(a(register, "register") + " a new user account."); 

            }
        } 
        else if (currentUser.getPrivilege().isAbove(Privilege.GUEST)) {
            body.append("Logged in as " + currentUser.getEmail()); 
            String userID = currentUser.getId();
            String develop = WareHouse.getUrlPathForClass(page.tools.management.SandBox.class);
            String upload = WareHouse.getUrlPathForClass(page.tools.management.FileUploadPage.class);
            String edit = WareHouse.getUrlPathForClass(page.example.UserFiles.class) + "?userID=" + userID;
            String details = WareHouse.getUrlPathForClass(page.tools.stats.BrowserInfo.class) + "?userID=" + userID;
            
            body.append(" [ "); 
            body.append(a(develop, "Develop") + " | ");
            body.append(a(upload, "Upload") + " | ");
            body.append(a(edit, "My Files") + " | ");
            body.append(a(details, "My Details") + " ");            
            body.append("]"); 
            if (currentUser.getPrivilege().isAbove(Privilege.PREMIUM_USER)) {
                body.append(" (" + currentUser.getPrivilege().getLabel() + ")"); 
            }            
        }
        
        return form(body.toString(), conn.getRequest().getUri());
    }
    
    private String implantCookie(User user, String domain, String alt) {
        
        String extImg = WareHouse.getUrlPathForClass(page.image.SetCookie.class)
                      + "?userID=" + user.getId();
        
        return image(domain + extImg, alt, "title='" + alt + "' width='1' height='1'");
    }
}
