package com.FitBank.web.servlet;

import com.FitBank.common.Debug;
import com.FitBank.common.Servicios;

import com.FitBank.web.util.ConstruirContenido;
import com.FitBank.web.util.EjecutarEventos;

import com.FitBank.xml.Mensaje.DatoGeneral;
import com.FitBank.xml.Mensaje.MensajeXml;

import com.fitbank.common.crypto.Decrypt;


/**
 * Servlet que es invocado para enviar al cliente una página html para el ingreso de una nueva
 * contraseña, y también en el caso de que la nueva contraseña sea ingresada y confirmada.
 * 
 * @author FitBank
 */
public class ChangePassword extends BaseServlets {
  private static final String PATH = "/changePassword.html";

  protected void inicializar() {
    aceptarGet();
    aceptarPost();
    obtenerWriter();
  }

  protected void procesarPedido() {
    String newPassword        = Servicios.verificarCadena(pedido.getParameter("newPassword"));
    String confirmNewPassword = Servicios.verificarCadena(pedido.getParameter("confirmNewPassword"));

    if(newPassword.equals("")) {
      writer.print(ConstruirContenido.changePassword(
          getServletConfig().getServletContext().getRealPath(ChangePassword.PATH),pedido.getSession().getId()));
    } else {
      if(!newPassword.equals("") && newPassword.equalsIgnoreCase(confirmNewPassword)) {
        evento.procesoXml.getXmlMensaje().setValor(new DatoGeneral("USR", evento.getUsuario()),
          MensajeXml.SEC_CAB);

        try {
            Decrypt de = new Decrypt();
            if(de.isWebencrypt()){
                newPassword = de.encrypt(newPassword);
            }
        } catch (Exception ex) {;}

        evento.procesoXml.getXmlMensaje().setValor(new DatoGeneral("NPW", newPassword),
          MensajeXml.SEC_CAB);
        evento.obtenerCompanias(pedido);

        if(verificarRespuesta()) {
          writer.print(ConstruirContenido.exitoChangePassword(evento));

          return;
        }
      }

      writer.print(ConstruirContenido.errorChangePassword(evento));
    }
  }

  private String[][] construirEncabezado() {
    String[][] cb = {
        { "USR", Servicios.verificarCadena((String)pedido.getParameter("usuario")) },
        { "PWD", Servicios.verificarCadena((String)pedido.getParameter("password")) },
        { "SID", sesion.getId() },
        { "TIP", MensajeXml.TIP_SIG },
        { "FTR", Servicios.obtenerFechaAS() },
        { "IPA", pedido.getRemoteAddr() },
        { "MAC", pedido.getRemoteAddr() },
        { "SUB", "01" },
        { "TRN", "0000" },
        { "VER", "01" }
      };

    return cb;
  }

  /**
   * Método determina si el mensaje enviado del repositorio como respuesta indica que el usuario ha
   * sido autenticado por el sitema(TRUE) o ha sido rechazado(FALSE).
   *
   * @return Devuelve un objeto que indica si fue exitoso el proceso ejecutado dentro del método.
   */
  private boolean verificarRespuesta() {
    if(evento.procesoXml.getXmlMensaje() != null) {
      return evento.procesoXml.getXmlMensaje().getValor("COD", MensajeXml.SEC_RES).equalsIgnoreCase("0");
    } else {
      Debug.imprimirError("ERROR EL REPOSITORIO DEVUELVE NULL..  Servlet ValidarSesion");

      return false;
    }
  }
}
