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 JQueryQuickSignIn implements HTTPResponder {
    
    private static final String emailField = "qsi_email";
    private static final String passwordField = "qsi_password";
    private static final String signinButton = "qsi_signin_button";
    private static final String signoutButton = "qsi_signout_button";
    private static final String resetButton = "qsi_reset_button";
    
    
    public Object respond(HTTPHandler conn) throws IOException {

        String registerUrl = WareHouse.getUrlPathForClass(UserProfile.class);        
        
        User user = User.getUserById(conn.getRequest().getHeaders().getRequestCookies().get("userID"));
        
        Browser browser = Browser.getBrowser(conn);        
        User authenticatedUser = User.getUser(conn.getRequest());      
        
        String error = null;
        
        FormData formData = conn.getRequest().getFormData();
        if (formData != null) {
            String button = formData.getFirst("button");
            String email = formData.getFirst(emailField);               
            String password = formData.getFirst(passwordField);

            user = User.getUserByEmail(email);              
            if (button == null) {
                
            } else if (authenticatedUser != null && button.equals(signoutButton)) {
                authenticatedUser.endSession(conn.getRequest(), conn.getResponse());
                authenticatedUser = null;   
                
            } else if (button.equals(resetButton)) {
                try {
                    user.resetPassword(conn);       
                } catch (Exception ex) {
                    error = "Failed to reset password: " + ex.getMessage();
                }
                
            } else if (button.equals(signinButton)) {
                
                if (user == null) {

                    error = "<span class='error'>Account not found.</span> " +
                            a(registerUrl, "Register a new user account") + "." +
                            javaScript("$('#" + emailField + "').css('border-color', 'red');");
                }
                else if (!user.isCorrectPassword(password)) {

                    error = "<span class='error'>Incorrect password.</span> " +
                            submitbutton(resetButton, "Email a new password") + " to " + email + "." +
                            javaScript(buttonActionJavaScript(resetButton, emailField) +
                                       "$('#" + passwordField + "').css('border-color', 'red');");
                }
                else {
                    user.startSession(password, conn);
                }
                authenticatedUser = User.getUser(conn.getRequest());  
            }
        }
        
        StringBuilder body = new StringBuilder();   
        
        if (authenticatedUser != null) {
            body.append(getSignOutForm());
            body.append("Signed in as " + authenticatedUser.getEmail());
            
            String userID = authenticatedUser.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 (authenticatedUser.getPrivilege().isAbove(Privilege.PREMIUM_USER)) {
                body.append(" (" + authenticatedUser.getPrivilege().getLabel() + ")"); 
            }                  
        }        
        else if (authenticatedUser == null) {
            String email = (user == null) ? "" : user.getEmail();
            body.append(getSignInForm(email));

            if (error != null) {
                body.append(error);
            } else if (browser == null) {
                body.append("Welcome, please enable cookie support to sign in."); 
            } 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 "); 
                body.append(a(registerUrl, "register a new user account") + ".");
            }
        }     
        
        return body.toString();
    }
    
    private String getSignInForm(String email) {
        StringBuilder form = new StringBuilder();
        form.append(div("signin", 
                    textfield(emailField, email) +
                    passwordfield(passwordField, "") + 
                    submitbutton(signinButton, "Sign in")
        ));

        form.append(javaScript(
                buttonActionJavaScript(signinButton, emailField, passwordField) +
                "populateElement('#" + emailField + "', 'Email address');"));
        
       return form.toString();
    }
    
    private String getSignOutForm() {
        StringBuilder form = new StringBuilder();
        form.append(div("signin", submitbutton(signoutButton, "Sign out")));

        form.append(javaScript(buttonActionJavaScript(signoutButton)));
        
       return form.toString();
    }    
    
    private String buttonActionJavaScript(String buttonId, String... fieldNames) {
        String thisUrl = WareHouse.getUrlPathForClass(this.getClass());
        
        return 
            "$('#" + buttonId + "').click(function(){" +
            "  $('#quick-signin').slideUp(200, function(){" +   
            "    var button = '" + buttonId + "';" +
            "    $.post('" + thisUrl + "', { " +
            		"button: button" + getFieldData(fieldNames) +
            "      }, function(html) {" +
            "      $('#quick-signin').html(html);" +
            "      $('#quick-signin').slideDown(500);" +
            "    });" +
            "  });" + 
            "});";
    }
    
    private String getFieldData(String... fieldNames) {
        StringBuilder js = new StringBuilder();
        for (int i=0; i<fieldNames.length; i++) {
            js.append(", " + fieldNames[i] + ":" + "$('#" + fieldNames[i] + "').val()");
        }
        return js.toString();
    }
}
