package page.config;

import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.HTTPHeaders;
import org.wikiwebserver.handler.http.interfaces.*;

import page.tools.entity.Browser;

public class SiteSessionFinder implements SessionFinder {

    public Object findSession(HTTPHandler conn) throws Exception {
        
        HTTPHeaders requestHeaders = conn.getRequest().getHeaders();  
        HTTPHeaders responseHeaders = conn.getResponse().getHeaders();
        
        String browserId = getBrowserId(conn);
        Browser b = null;
        if (browserId != null) {
            // Browser created?
            b = Browser.getBrowserById(browserId);
            if (b == null) {
                b = new Browser(browserId);
                if (b.hasAllocatedId() || browserId.contains("Bot") || browserId.contains("WWS")) {  
                    // Browser identified, mark created (cookie support)                    
                    b.put("createdTime", new Long(System.currentTimeMillis()));
                // Bad cookie, nullify and start again
                } else b = null;
            }
            
            
            // Remove old Cookie data
            if (requestHeaders.getRequestCookies().get("WikiWebServerData") != null) {
                responseHeaders.setResponseCookie("WikiWebServerData", null);
            }
        }
        // Allocate browser ID
        if (b == null) {
            
            // Log first visited page
            String entrance = conn.getRequest().getUri();
            if (entrance != null) responseHeaders.setResponseCookie("entrance", entrance);
            
            // Log first referrer            
            String referer = conn.getRequest().getHeaders().getFirst("Referer");
            if (referer != null) responseHeaders.setResponseCookie("referer", referer);

            if (conn.getHTTPConfig()!= null) {
                responseHeaders.setResponseCookie("serverID", 
                    conn.getHTTPConfig().staticIdentity("ServerID"));
            }
            responseHeaders.setResponseCookie("browserID", Browser.allocateId());
        }   
        
        return b;
    }
    
    public static String getBrowserId(HTTPHandler conn) {
        
        HTTPHeaders requestHeaders = conn.getRequest().getHeaders();        
        
        // Is this a known bot / spider or child WikiWebServer?
        String userAgent = conn.getRequest().getHeaders().getFirst("User-Agent");
        if (userAgent != null) {
            userAgent = userAgent.toLowerCase();  
            // Make an artificial cookie for bots
            String artificialId = null;
            if (userAgent.contains("googlebot")) artificialId = "GoogleBot";
            else if (userAgent.contains("msnbot")) artificialId = "MSNBot"; 
            else if (userAgent.contains("slurp")) artificialId = "YahooBot";
            else if (userAgent.startsWith("wikiwebserver")) {               
                int idx1 = userAgent.lastIndexOf("(");
                int idx2 = userAgent.lastIndexOf(")");                
                if (idx1 > -1 && idx2 > idx1+1) {
                    String uniqueId = userAgent.substring(idx1+1, idx2);                  
                    artificialId = "WWS-" + uniqueId;
                }
            }
            if (artificialId != null) {
                requestHeaders.set("Cookie", "browserID=" + artificialId);
            }
        }        
        
        String browserID = requestHeaders.getRequestCookies().get("browserID");
        if (browserID != null) {
            // Strip nasties
            browserID = browserID.replace("'", "");
            browserID = browserID.replace("\"", "");
            browserID = browserID.replace("<", "");
            browserID = browserID.replace(">", "");
            browserID = browserID.replace("&", "");
        }

        return browserID;
    }     

}

