/*
 * SACServlet.java
 *
 * Created on 28 de Novembro de 2001, 21:13
 */

package sac.gui.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Iterator;
import java.util.Map;
import java.util.Hashtable;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import sac.fachada.SACFachada;
import sac.gui.handler.SACHandler;

import sac.gui.handler.MenuLoginHandler;
import sac.gui.handler.MenuCadastroPFHandler;
import sac.gui.handler.MenuCadastroPJHandler;
import sac.gui.handler.ConsultaPFHandler;
import sac.gui.handler.ConsultaPJHandler;
import sac.gui.handler.MenuOperadorHandler;
import sac.gui.handler.DrogaHandler;

/**
 *
 * @author  srmq
 * @version
 */
public class SACServlet extends HttpServlet {

    /** Fachada do sistema.
     */
    private SACFachada sacFachada;

    /** Constante que define o Name do Hidden de um Form que
     * identifica unicamente o Handler que tratará uma operação.
     */
    private static final String HANDLER_NAME = "HANDLER_NAME";

    /** Constante que define o Name do Hidden de um Form que
     * identifica unicamente o Handler que tratará as operações
     * do menu.
     */
    // FIXME - deve estar num arquivo de propriedades
//    private static final String MENU_LOGIN_HANDLER_NAME = "MenuLoginHandler";
//    private static final String CADASTRO_PF_HANDLER_NAME = "CadastroPFHandler";
//    private static final String CADASTRO_PJ_HANDLER_NAME = "CadastroPJHandler";
//    private static final String CONSULTA_PF_HANDLER_NAME = "ConsultaPFHandler";
//    private static final String CONSULTA_PJ_HANDLER_NAME = "ConsultaPJHandler";
//    private static final String OPERADOR_HANDLER_NAME = "OperadorHandler";

    /** Guarda o mapeamento (form, Handler)
     */
    protected Map formImplementers;

    /** Guarda o último handler solicitado.
     */
    protected SACHandler currentImplementer;

    /** Guarda o form de onde partiu a última solicitação.
     */
    protected String currentForm;

    /** Initializes the servlet.
    */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

        try {
          sacFachada = new SACFachada();
        } catch (Exception e) {
          throw new ServletException(e);
        }

        formImplementers = new Hashtable();
        try {
            Properties pro = new Properties();
            pro.load(this.getClass().getResourceAsStream("/servlet.properties"));
            Iterator ite = pro.keySet().iterator();
            while ( ite.hasNext()) {
              String hand_name = (String) ite.next();
              String class_name = pro.getProperty(hand_name);
              System.out.println("Carregando handler='"+hand_name+"' class='"+class_name+"'.");
              formImplementers.put( hand_name, Class.forName(class_name).newInstance() );
            }
        } catch (FileNotFoundException fnfe ){
            new ServletException(fnfe);
        } catch (IOException ioe ){
            new ServletException(ioe);
        } catch (ClassNotFoundException cnfe){
            new ServletException(cnfe);
        } catch (InstantiationException ie) {
            new ServletException(ie);
        } catch (IllegalAccessException iae) {
            new ServletException(iae);
        }
//        formImplementers.put(MENU_LOGIN_HANDLER_NAME, new MenuLoginHandler());
//        formImplementers.put(CADASTRO_PF_HANDLER_NAME, new MenuCadastroPFHandler());
//        formImplementers.put(CADASTRO_PJ_HANDLER_NAME, new MenuCadastroPJHandler());
//        formImplementers.put(CONSULTA_PF_HANDLER_NAME, new ConsultaPFHandler());
//        formImplementers.put(CONSULTA_PJ_HANDLER_NAME, new ConsultaPJHandler());
//        formImplementers.put(OPERADOR_HANDLER_NAME, new MenuOperadorHandler());

    }

    /** Destroys the servlet.
    */
    public void destroy() {

    }

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

        String formName = request.getParameter(SACServlet.HANDLER_NAME);
        String res = null;
        Object handler;

        System.out.println("Implementadores sao: "+formImplementers);

        if (formName != null) {
            if (formName.equals(currentForm)) {
                handler = currentImplementer;
            } else {
                handler = formImplementers.get(formName);
            }
            if (handler != null) {
                System.out.println("Conseguiu obter o handler " + formName);
                res = ((SACHandler) handler).processRequest(request, response, sacFachada);
                this.currentForm = formName;
                this.currentImplementer = (SACHandler) handler;
            } else {
                System.out.println("Nao conseguiu obter o handler " + formName);
            }
        } else System.out.println("formName nulo");

            getServletConfig().getServletContext().
            getRequestDispatcher(res).forward(request, response);
    }

    /** Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

    /** Returns a short description of the servlet.
    */
    public String getServletInfo() {
        return "Short description";
    }

}
