/*
 * MenuHandler.java
 *
 * Created on 28 de Novembro de 2001, 22:21
 */

package sac.gui.handler;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;

import sac.fachada.SACFachada;
import sac.pessoa.UsuarioComum;
import sac.pessoa.PessoaNaoCadastradaException;
import sac.persistencia.PersistenceException;
import sac.exception.InvalidArgumentException;
import sac.gui.bean.AutenticacaoBean;
import sac.gui.bean.LoginUsuarioBean;
import sac.exception.ItemNaoCadastradoException;

/**
 * Handler para o formulário de login no sistema.
 *
 * @author  fcan, esrb
 */
public class MenuLoginHandler extends SACHandler {

    /** Constante que define o Name do Hidden de um Form que
     * identifica unicamente o Handler que tratará a operação
     * de logar.
     */
    // FIXME - deve estar num arquivo de propriedades
    private static final String LOGIN_OPERATION_NAME = "LoginOperation";
    private static final String LOGOUT_OPERATION_NAME = "LogoutOperation";

    /** 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 MenuLoginHandler() {
        super();
        this.functionImplementers = new Hashtable();
        this.functionImplementers.put(LOGIN_OPERATION_NAME, new LoginOperationHandler());
        this.functionImplementers.put(LOGOUT_OPERATION_NAME, new LogoutOperationHandler());
    }

    /** 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;
    }

    private class LoginOperationHandler extends SACHandler {

        /** Constantes que guardam os caminhos dos JSP.
         *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
         */
        private static final String URL_LOGIN_OK = "/portal.jsp";
        private static final String URL_LOGIN = "/portal.jsp";

        private static final String URL_ERRO_PERSISTENCIA = "/portal.jsp";

        /** Constantes utilizadas no Request desse Handler.
         */
        private static final String USUARIO_BEAN_REQUEST = "usuario";
        private static final String AUTENTICACAO_BEAN_REQUEST = "autenticacao";

        /** Constantes que definem os nomes dos Inputs do Form.
         */
        private static final String USUARIO_LOGIN_INPUT = "login";
        private static final String USUARIO_SENHA_INPUT = "senha";
        private static final String USUARIO_TIPO_INPUT = "tipoPessoa";

        /** 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 = null;
            UsuarioComum usuario = null;

            /**
             * Obtem o login e a senha do form.
             */
            String login = request.getParameter(USUARIO_LOGIN_INPUT);
            String senha = request.getParameter(USUARIO_SENHA_INPUT);
	    String status = request.getParameter(USUARIO_TIPO_INPUT);

            if (status == null) {
                AutenticacaoBean autenticacao = new AutenticacaoBean();

                autenticacao.setLogin(login);
                autenticacao.setErroLogin("Escolha uma das opções acima.");

                /** Insere o Bean no request. */
                request.setAttribute(AUTENTICACAO_BEAN_REQUEST, autenticacao);

                /** Define a página de resposta */
                res = URL_LOGIN;
           } else {


              char tipoPessoa;

              //Verifica se o status retornado é pessoa fisica
              if (status.equals("fisica")) {
                  tipoPessoa = UsuarioComum.STATUS_PESSOA_FISICA;
              } else {
                  tipoPessoa = UsuarioComum.STATUS_PESSOA_JURIDICA;
              }

              /**
               *  Valida o login.
               */
              try {

                  usuario = fachada.procuraUsuario(login, tipoPessoa);
                  /** Valida a senha.
                   */
                   if (usuario.getSenha().equals(senha)) {
                      LoginUsuarioBean usuarioBean;

                      /**
                       * Verifica novamente o status (para o caso de ser um operador
                       * logando).
                       */
                       tipoPessoa = usuario.getStatus();

                      /** Insere o OID na sessão. */
                      request.getSession(true).setAttribute(SACHandler.OID_SESSION,
                                                            usuario.getId());

                      /** Cria o bean de um usuario. */
                      usuarioBean = new LoginUsuarioBean(usuario.getNome(), login,
                                                         senha, tipoPessoa);

                      /** Insere o Bean no request. */
                      request.setAttribute(USUARIO_BEAN_REQUEST, usuarioBean);

                      /** Define a página de resposta */
                      res = URL_LOGIN_OK;

                      /**
                       *  Caso login esteja correto, mas senha errada.
                       */
                   } else {

                      AutenticacaoBean autenticacao = new AutenticacaoBean();

                      autenticacao.setLogin(login);
                      autenticacao.setErroSenha("Senha Inválida.");

                      /** Insere o Bean no request. */
                      request.setAttribute(AUTENTICACAO_BEAN_REQUEST, autenticacao);

                      /** Define a página de resposta */
                      res = URL_LOGIN;

                   }

              } catch(ItemNaoCadastradoException pnce) {

                  AutenticacaoBean autenticacao = new AutenticacaoBean();
                  autenticacao.setErroLogin("Login Inválido");

                  /** Insere o Bean no request. */
                  request.setAttribute(AUTENTICACAO_BEAN_REQUEST, autenticacao);

                  /** Define a página de resposta */
                  res = URL_LOGIN;

              } catch(PersistenceException pe) {
                  AutenticacaoBean autenticacao = new AutenticacaoBean();
                  autenticacao.setErroPersistencia("Problemas na conexão com BD.");
                  res = URL_ERRO_PERSISTENCIA;

              } catch(InvalidArgumentException iae) {
                  // NUNCA VAI ACONTECER...
              }
          }
            return res;

      }
    }

    private class LogoutOperationHandler extends SACHandler {

        /** Constantes que guardam os caminhos dos JSP.
         *  FIXME isso tem que estar num arquivo!!!!!!!!!!!!
         */
        private static final String URL_LOGIN = "/portal.jsp";
        /** 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 {

          request.getSession().invalidate();
          return URL_LOGIN;
        }

    }
}
