package org.projectapollo.demo;

import apollo.*;
import apollo.Template.*;
import apollo.Session.*;
import apollo.Log.*;
import apollo.Storable.*;
import apollo.Statistics.*;
import java.net.*;

import
org.projectapollo.demo.Home.*;
import org.projectapollo.demo.Frame.*;
import org.projectapollo.demo.SessionExpired.*;
import org.projectapollo.demo.Jobs.*;
import org.projectapollo.demo.Storable.*;
import org.projectapollo.demo.Session.*;
import org.projectapollo.demo.General.*;
import org.projectapollo.demo.Logout.*;

import
MysqlAdmin.MAMainMenu.*;

import
java.util.*;

/** The RootPage Broker for ApolloDemo web application
*/
public class RootPageBroker extends PageBroker {
    private Vector AS;
    public RootPageBroker(ManagerTracker MT, String fquid, PageBroker PB) throws TemplatePageException {
        super(MT,fquid,PB);
         //Start global managers here
        //Register children nodes
        this.registerPageHandler("Home",new HomeBroker(MT,"Home", this));
        this.registerPageHandler("SessionExpired",new SessionExpiredBroker(MT,"SessionExpired", this));
        this.registerPageHandler("Frame",new FrameBroker(MT,"Frame", this));
        this.registerPageHandler("Jobs",new JobsBroker(MT,"Jobs", this));
        this.registerPageHandler("Statistics", new StatisticsHandler(MT,"Statistics",this));
        this.registerPageHandler("CreateAccount", new CreateAccountHandler(MT,"CreateAccount",this));
        this.registerPageHandler("Session", new SessionBroker(MT,"Session",this));
        this.registerPageHandler("General", new GeneralBroker(MT,"General",this));
        this.registerPageHandler("Logout", new LogoutBroker(MT,"Logout",this));
        this.registerPageHandler("MAMainMenu", new MAMainMenuBroker(MT, "MAMainMenu", this));

        MT.getPM().registerTemplatePage(
"", new TemplatePage(MT, this, "login.html"));
        MT.getPM().registerTemplatePage(
"LeftBarJavascript", new TemplatePage(MT, this, "leftbarjavascript.html"));

        AS =
new Vector();
        AcceptClause needLogin =
new AcceptClause("NeedLogin");
        AcceptClause loginAttempt=
new AcceptClause("Login");
        loginAttempt.addAcceptClause(AcceptClause.STRING,
"UserName", AcceptClause.REQUIRED);
        loginAttempt.addAcceptClause(AcceptClause.STRING,
"Password", AcceptClause.REQUIRED);

        AS.addElement(loginAttempt);
        AS.addElement(needLogin);
    }
    public HTTPResponse render(TransactionTracker TT, HTTPRequest req, WebSession thisSession) throws ApolloException {
        Hashtable RT =
new Hashtable();

        RT.put(
"JSAlert", new Boolean(false));
        EntryAssertionManager EAM =
new EntryAssertionManager(MT, AS);
        EAM.evaluate(req);

   
     if (EAM.isAccept("Login")) {

   
         //Authenticate
             User u = User.loadInstance(TT, new Object[] {EAM.getString("UserName")});
            if (u==null) {
             //User does not exist
                 RT.put("JSAlert", new Boolean(true));
                RT.put(
"JSMessage", "Login incorrect");
                return MT.getPM().getPage("").render(RT,thisSession);
            }
            if (!u.getPassword().equals(EAM.getString("Password"))) {
                 //Bad password!
                RT.put("JSAlert", new Boolean(true));
                RT.put(
"JSMessage", "Login incorrect");
                return MT.getPM().getPage("").render(RT,thisSession);
            }

                //Issue Session
             thisSession = MT.getSM().newSession(EAM.getString("UserName"));
            WhereQuery wq =
new WhereQuery();
            wq.insertWhereClause(WhereQuery.AND,
"userID", User.class, u.getUserID());
            Storable.addValueAtomic(TT, User.
class, "numLogins", 1, wq);

   
          //Populate session with goodies
             thisSession.setValue("User", u);
            req.setValue(
"Destination","Home");

   
          //Use Frameset
            return this.handleRequest(TT, "Frame", req, thisSession);
        }
        return MT.getPM().getPage("").render(RT,thisSession);
    }
}