package sac.gui.handler;

import javax.servlet.*;
import javax.servlet.http.*;

import java.util.List;
import java.util.Vector;
import java.util.Arrays;
import java.util.Map;
import java.io.IOException;
import java.util.Hashtable;

import sac.doenca.Doenca;
import sac.exception.ItemJaCadastradoException;
import sac.exception.ItemNaoCadastradoException;
import sac.exception.InvalidArgumentException;
import sac.exception.NullArgumentException;
import sac.fachada.SACFachada;
import sac.pessoa.fisica.PessoaFisica;
import sac.pessoa.fisica.CPFInvalidoException;
import sac.pessoa.endereco.Endereco;
import sac.persistencia.PersistenceException;
import sac.gui.bean.CadastroServicoBean;
import sac.gui.bean.CadastroCategoriasBean;
import sac.pessoa.SenhaInvalidaException;
import sac.pessoa.UsuarioComum;
import sac.persistencia.OID;

/**
 * Handler para o formulário de login no sistema.
 *
 * @author  fcan, esrb
 */
public class MenuOperadorHandler extends SACHandler {


    // FIXME - deve estar num arquivo de propriedades
    private static final String OPERACAO_CADASTRO_SERVICOS = "CadastroServicosOperation";
    private static final String OPERACAO_CADASTRO_CATEGORIAS = "CadastroCategoriasOperation";
    private static final String OPERACAO_PREENCHE_CATEGORIAS = "PreencheCategoriasHandler";
    private static final String OPERACAO_PREENCHE_SERVICOS = "PreencheServicosHandler";

    /** 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;

    /** Creates new MenuHandler */
    public MenuOperadorHandler() {
        super();
        this.functionImplementers = new Hashtable();
        this.functionImplementers.put(OPERACAO_CADASTRO_SERVICOS, new CadastroServicosHandler());
        this.functionImplementers.put(OPERACAO_CADASTRO_CATEGORIAS, new CadastroCategoriasHandler());
        this.functionImplementers.put(OPERACAO_PREENCHE_CATEGORIAS, new PreencheCategoriasHandler());
        this.functionImplementers.put(OPERACAO_PREENCHE_SERVICOS, new PreencheServicosHandler());
    }

    /** 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 sacFachada)
    throws ServletException, IOException {
        String functionName = request.getParameter(SACHandler.FUNCTION_ID);
        String res = null;
        Object handler;
        if (functionName.equals(currentFunction)) {
            handler = currentImplementer;
        } else {
            handler = functionImplementers.get(functionName);
        }
        if (handler != null) {
            res = ((SACHandler) handler).processRequest(request, response, sacFachada);
            this.currentFunction = functionName;
            this.currentImplementer = (SACHandler) handler;
        } else {
            System.out.println("Nao conseguiu obter o handler " + functionName);
        }
        return res;
    }


    /**
     * Handler para a operacao de cadastro serviços no sistema.
     * Operação realizada apenas por usuário operador.
     */
    private class CadastroServicosHandler extends SACHandler {

     /** Constantes que guardam os caminhos dos JSP.
      *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
      */
      private static final String URL_CADASTRO_SERVICO = "/jsp/cadastroServicos.jsp";
      private static final String URL_CADASTRO_OK = "/portal.jsp";

      /**
       * Constantes utilizadas no Request desse Handler.
       */
      private static final String CADASTRO_SERVICOS_BEAN_REQUEST = "servicos";

      /** Constantes que definem os nomes dos Inputs do Form.
      */
      private static final String NOME_INPUT = "nome";

      /** 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 res = URL_CADASTRO_SERVICO;
        String nome = request.getParameter(NOME_INPUT);

        CadastroServicoBean servicos = new CadastroServicoBean();
        servicos.setNome(nome);



          if(nome.equals("")) {
                servicos.setMensagem("Preencha o nome do serviço!");
            	/** Insere bean no request*/
            	request.setAttribute(CADASTRO_SERVICOS_BEAN_REQUEST, servicos);
          } else {
          try {
                fachada.cadastraTipoServico(nome);
                res = URL_CADASTRO_OK;


        } catch (ItemJaCadastradoException ijce) {
            servicos.setMensagem("Tipo de Serviço já registrado no sistema!");
            servicos.setNome("");
            request.setAttribute(CADASTRO_SERVICOS_BEAN_REQUEST, servicos);
        } catch (PersistenceException pe) {
            servicos.setMensagem("Problemas na conexão com o BD");
            request.setAttribute(CADASTRO_SERVICOS_BEAN_REQUEST, servicos);
        } catch (InvalidArgumentException iae) {
            // nao vai acontecer
            iae.printStackTrace();
        //} catch (NullArgumentException nae) {
            // nao vai acontecer
            //nae.printStackTrace();
        }
      }
      return res;
      }

	}


    /**
     * Handler para a operacao de cadastro de categorias no sistema.
     * Operação realizada apenas por usuário operador.
     */
    private class CadastroCategoriasHandler extends SACHandler {

     /** Constantes que guardam os caminhos dos JSP.
      *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
      */
      private static final String URL_CADASTRO_CATEGORIAS = "/jsp/cadastroCategorias.jsp";
      private static final String URL_CADASTRO_OK = "/portal.jsp";

      /**
       * Constantes utilizadas no Request desse Handler.
       */
      private static final String CADASTRO_CATEGORIAS_BEAN_REQUEST = "categorias";

      /** Constantes que definem os nomes dos Inputs do Form.
      */
      private static final String NOME_CATEGORIA_INPUT = "nomeCategoria";
      private static final String NOME_SUBCATEG1_INPUT = "nomeSubCateg1";
      private static final String NOME_SUBCATEG2_INPUT = "nomeSubCateg2";
      private static final String NOME_SUBCATEG3_INPUT = "nomeSubCateg3";

      /** 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 res = URL_CADASTRO_CATEGORIAS;
        String nome = request.getParameter(NOME_CATEGORIA_INPUT);
        String sub1 = request.getParameter(NOME_SUBCATEG1_INPUT);
        String sub2 = request.getParameter(NOME_SUBCATEG2_INPUT);
        String sub3 = request.getParameter(NOME_SUBCATEG3_INPUT);

        CadastroCategoriasBean categorias = new CadastroCategoriasBean();
        categorias.setCategoria(nome);
        categorias.setSubCategoria1(sub1);
        categorias.setSubCategoria2(sub2);
        categorias.setSubCategoria3(sub3);

          if(nome.equals("")) {
                categorias.setMensagem("Preencha o nome da Categoria a ser inserida no sistema!");
            	/** Insere bean no request*/
            	request.setAttribute(CADASTRO_CATEGORIAS_BEAN_REQUEST, categorias);
          } else {
              try {
                fachada.cadastraCategoria(nome);
                if(!sub1.equals("")) {
                	fachada.cadastraSubCategoria(sub1);
                	fachada.cadastraRelCategoria(nome, sub1);
                }
                if(!sub2.equals("")) {
                	fachada.cadastraSubCategoria(sub2);
                	fachada.cadastraRelCategoria(nome, sub2);
                }
                if(!sub3.equals("")) {
                	fachada.cadastraSubCategoria(sub3);
                	fachada.cadastraRelCategoria(nome, sub3);
                }
                res = URL_CADASTRO_OK;


        } catch (ItemJaCadastradoException ijce) {
           categorias.setMensagem("Tipo de Categoria já registrado no sistema!");
           request.setAttribute(CADASTRO_CATEGORIAS_BEAN_REQUEST, categorias);
        } catch (PersistenceException pe) {
            categorias.setMensagem("Problemas na conexão com o BD");
            request.setAttribute(CADASTRO_CATEGORIAS_BEAN_REQUEST, categorias);
        } catch (InvalidArgumentException iae) {
            // nao vai acontecer
            iae.printStackTrace();
        //} catch (NullArgumentException nae) {
            // nao vai acontecer
            //nae.printStackTrace();
        }
      }
      return res;
      }

    }

        /**
     * Handler para a operacao de cadastro de categorias no sistema.
     * Operação realizada apenas por usuário operador.
     */
    private class PreencheCategoriasHandler extends SACHandler {

     /** Constantes que guardam os caminhos dos JSP.
      *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
      */
      private static final String URL_CADASTRO_CATEGORIAS = "/jsp/cadastroCategorias.jsp";

      /**
       * Constantes utilizadas no Request desse Handler.
       */
      private static final String CADASTRO_CATEGORIAS_BEAN_REQUEST = "categorias";

      /** 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 res = URL_CADASTRO_CATEGORIAS;

        CadastroCategoriasBean categorias = new CadastroCategoriasBean();
         return res;
      }

    }
              /**
     * Handler para a operacao de cadastro de categorias no sistema.
     * Operação realizada apenas por usuário operador.
     */
    private class PreencheServicosHandler extends SACHandler {

     /** Constantes que guardam os caminhos dos JSP.
      *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
      */
      private static final String URL_CADASTRO_SERVICOS = "/jsp/cadastroServicos.jsp";

      /**
       * Constantes utilizadas no Request desse Handler.
       */
      private static final String CADASTRO_CATEGORIAS_BEAN_REQUEST = "servicos";

      /** 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 res = URL_CADASTRO_SERVICOS;

        CadastroServicoBean servicos = new CadastroServicoBean();
         return res;
      }

    }
}