package sac.gui.handler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

import sac.fachada.SACFachada;
import sac.gui.bean.EnderecoBean;
import sac.gui.bean.PreOperationPJBean;
import sac.gui.bean.PessoaJuridicaBean;
import sac.persistencia.PersistenceException;
import sac.pessoa.endereco.Endereco;
import sac.pessoa.juridica.PessoaJuridica;

public class CadastroPJHandler extends SACHandler {

    /** Guarda o mapeamento (operacao, Handler)
     */
    protected Map functionImplementers;

    /** Guarda o último handler solicitado.
     */
    protected SACHandler currentImplementer;

    /** Guarda a última operação solicitada.
     */
    protected String currentFunction;

    private final String CADASTRO_OPERATION = "CADASTRO_OPERATION";
    private final String PRE_OPERATION = "PRE_OPERATION";

    private final String URL_CADASTRO_PJ = "/jsp/newcadastroPJ.jsp";

    private final String NOME_INPUT = "nome";
    private final String RUA1_INPUT = "rua1";
    private final String BAIRRO1_INPUT = "bairro1";
    private final String ESTADO1_INPUT = "estado1";
    private final String CIDADE1_INPUT = "cidade1";
    private final String PAIS1_INPUT = "pais1";
    private final String CEP1_INPUT = "cep1";
    private final String TELEFONE1_INPUT = "telefone1";

    private final String RUA2_INPUT = "rua2";
    private final String BAIRRO2_INPUT = "bairro2";
    private final String ESTADO2_INPUT = "estado2";
    private final String CIDADE2_INPUT = "cidade2";
    private final String PAIS2_INPUT = "pais2";
    private final String CEP2_INPUT = "cep2";
    private final String TELEFONE2_INPUT = "telefone2";

    private final String CATEGORIA_INPUT = "categoria";
    private final String SUBCATEGORIA_INPUT = "subcategoria";
    private final String INSC_MUNICIPAL_INPUT = "insc_municipal";
    private final String INSC_ESTADUAL_INPUT = "insc_estadual";
    private final String HOMEPAGE_INPUT = "homepage";
    private final String EMAIL_INPUT = "email";
    private final String ATIVIDADES_INPUT = "atividades";
    private final String CNPJ_INPUT = "cnpj";

    private final String PRE_OPERATION_PJ_BEAN_REQUEST = "preOperationPJ";



    public CadastroPJHandler() {
        super();
        this.functionImplementers = new Hashtable();
        init();
    }

    private void init() {
        // preenchendo a funcao de operacoes do Handler
        functionImplementers.put(CADASTRO_OPERATION, new CadastroHandler());
        functionImplementers.put(PRE_OPERATION, new PreencherFormHandlerCadastro());
    }


    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    * @param fachada fachada do Sistema
    * @return String a url do form a ser retornado
    */
    public  String processRequest(HttpServletRequest request, HttpServletResponse response, SACFachada fachada)
            throws ServletException, IOException {
        String functionName = request.getParameter(SACHandler.FUNCTION_ID);
        String result = null;
        SACHandler handler;

        if (functionName.equals(currentFunction)) {
            handler = currentImplementer;
        } else {
            handler = (SACHandler) functionImplementers.get(functionName);
            this.currentFunction = functionName;
            this.currentImplementer = handler;
        }
        if (handler != null) {
            result = handler.processRequest(request, response, fachada);
        } else {
            System.out.println("Nao conseguiu obter o handler " + functionName);
        }
        return result;
    }

    public void preencherFormPadrao(HttpServletRequest request,
        SACFachada fachada) throws ServletException {
        PreOperationPJBean prePJ;
        try {
            prePJ = createPreOperationBean(fachada);
        } catch ( PersistenceException pe){
            throw new ServletException ("Nao foi possivel criar Bean, "+ pe.getMessage() );
        }

        request.setAttribute( NOME_INPUT, "");
        request.setAttribute( RUA1_INPUT, "");
        request.setAttribute( BAIRRO1_INPUT, "");
        request.setAttribute( CEP1_INPUT, "");
        request.setAttribute( CIDADE1_INPUT, "");
        request.setAttribute( ESTADO1_INPUT, "PE");
        request.setAttribute( TELEFONE1_INPUT, "");
        request.setAttribute( PAIS1_INPUT, "BRASIL");

        request.setAttribute( RUA2_INPUT, "");
        request.setAttribute( BAIRRO2_INPUT, "");
        request.setAttribute( CEP2_INPUT, "");
        request.setAttribute( CIDADE2_INPUT, "");
        request.setAttribute( ESTADO2_INPUT, "PE");
        request.setAttribute( PAIS2_INPUT, "BRASIL");
        request.setAttribute( TELEFONE2_INPUT, "");

        request.setAttribute( CNPJ_INPUT, "");
        request.setAttribute( ATIVIDADES_INPUT, "");
        request.setAttribute( EMAIL_INPUT, "");
        request.setAttribute( HOMEPAGE_INPUT, "");
        request.setAttribute( INSC_ESTADUAL_INPUT, "");
        request.setAttribute( INSC_MUNICIPAL_INPUT, "");
        request.setAttribute( CATEGORIA_INPUT, "");
        request.setAttribute( SUBCATEGORIA_INPUT, "");

        request.setAttribute(PRE_OPERATION_PJ_BEAN_REQUEST, prePJ);
    }

    private PreOperationPJBean createPreOperationBean ( SACFachada fachada)
        throws PersistenceException {
        Map mapcategorias = fachada.listarCategorias();

        return  new PreOperationPJBean( mapcategorias);
    }


    /**
     * Handler para a operacao de alteracao de Pessoa Juridica no Sistema
     *
     */
    private class CadastroHandler extends SACHandler {

      /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
      * @param response servlet response
      * @param fachada fachada do Sistema
      * @return String a url do form a ser retornado
      */
      public  String processRequest(HttpServletRequest request, HttpServletResponse response, SACFachada fachada)
              throws ServletException, IOException {
              throw new  ServletException ("not implemented");

      }
    }

    /**
     * Handler para a operacao de preenchemento dos campos básicos do cadastro
     * de Pessoa Juridica no Sistema
     *
     */
    private class PreencherFormHandlerCadastro extends SACHandler {

      /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
      * @param request servlet request
      * @param response servlet response
      * @param fachada fachada do Sistema
      * @return String a url do form a ser retornado
      */
      public  String processRequest(HttpServletRequest request, HttpServletResponse response, SACFachada fachada)
              throws ServletException, IOException {
          preencherFormPadrao(request, fachada);
          request.setAttribute( SACHandler.FUNCTION_ID, CADASTRO_OPERATION);
          return URL_CADASTRO_PJ;
      }
    }
}