package com.fp.frontend.prueba;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.parametros.IngresoDatosTipoTramite;
import com.fp.frontend.controller.armas.solicitud.SolicitudArmasController;
import com.fp.frontend.controller.armas.solicitud.SolicitudTramiteController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

/**
 * Clase controladora para la validacion del deposito
 *
 * @author CHRISTIAN PAZMINO
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ValidarDepositoFlowController extends AbstractController<TarmSolicitudTramite> {

    private String csolicitud = "1";

    /**
     * Variable del tipo TgeneCatalogDetail(catalogo del tramite)
     */
    private TgeneCatalogDetail nombreTramite;
    /**
     * Variable del tipo TgeneCatalogDetail(catalogo de la categoria)
     */
    private TgeneCatalogDetail nombreCategoria;
    /**
     * Variable del tipo TgeneCatalogDetail(catalogo del uso actividad del
     * tramite)
     */
    private TgeneCatalogDetail nombreUsoActividad;
    /**
     * Opciones de aceptar o rechazar
     */
    private List<TgeneCatalogDetail> accionList;

    @ManagedProperty(value = "#{alfrescoController}")
    private AlfrescoController alfrescoController;

    private TarmSolicitud solicitud;

    private String accionTomada;

    private final String APROBAR = "APR";
    private final String REPROBAR = "RECH";

    private final String APROBAR_DEPOSITO = "APBDEP";
    private final String ANULAR_DEPOSITO = "ANUDEP";

    /**
     * Variable que indica si el usuario esta negado para continuar en la
     * pantalla
     */
    private Boolean isDenied;

    /**
     * Variable auxiliar usada para diferenciar cuando se presenta o no el
     * mensaje de validacion de fecha expiracion solicitud
     */
    private Boolean isOnlyMsj;

    public ValidarDepositoFlowController() throws Exception {
        super(TarmSolicitudTramite.class);
    }

    @PostConstruct
    private void postconstruct() {
        init();
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        this.beanalias = "VALIDARDEPOSITO";
        accionList = CatalogDetailController.find("ACCION");
        this.record = SolicitudTramiteController.findByCSolicitud(csolicitud);
        isOnlyMsj = false;
        try {
            isDenied = true;
            if (record != null) {
                solicitud = SolicitudArmasController.find(csolicitud);
                if (solicitud != null && solicitud.getCtramite() != null) {
                    TarmTramite tramite = IngresoDatosTipoTramite.find(solicitud.getCtramite().toString());
                    if (tramite != null) {
                        //Tramite			
                        nombreTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
                        nombreCategoria = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
                        nombreUsoActividad = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
                    } else {
                        MessageHelper.setMessageError("NO EXISTE UN TIPO DE TR\u00c1MITE ASOCIADO A LA SOLICITUD");
                    }
                } else {
                    MessageHelper.setMessageError("NO EXISTE UNA SOLICITUD ASOCIADA AL TR\u00c1MITE");
                }
            } else {
                MessageHelper.setMessageError("NO EXISTE EL TR\u00c1MITE EN LA BASE DE DATOS");
            }
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    public void cancelar() {
        init();
    }

    @Override
    public void save() {
        try {
            if (accionTomada.equalsIgnoreCase(APROBAR)) {
                record.setEstadotramite(APROBAR_DEPOSITO);
            } else {
                record.setEstadotramite(ANULAR_DEPOSITO);
            }
            super.update();
            DtoSave dtosave = super.getDtoSave();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            Request request = this.callerhelper.getRequest();
            msave.put(this.beanalias, dtosave); // adicionar metadata de mantenimiento para cada tabla.

            request.setSaveTables(msave);
            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
                isDenied = true;
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    protected void querydatabase() {
        try {

        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Retorna la ruta de documento base en donde se almacenar&aacute; dicho
     * archivo
     *
     * @return
     */
    public String getRutaDocumentoSolBase() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(solicitud.getFregistro());
        StringBuilder ruta = new StringBuilder("cm:Solicitudes");
        ruta = ruta.append("/cm:").append(calendar.get(Calendar.YEAR));
        ruta = ruta.append("/cm:").append((calendar.get(Calendar.MONTH) + 1) <= 9 ? "0" + (calendar.get(Calendar.MONTH) + 1) : (calendar.get(Calendar.MONTH) + 1));
        return ruta.toString();
    }

    /**
     * Metodo para validar el valor a pagar
     */
    public void validarValorDelDeposito() {
        if (record.getValorapagar().compareTo(record.getValorverificado()) != 0) {
            MessageHelper.setMessageError("EL VALOR VERIFICADO ES DIFERENTE DEL VALOR A PAGAR Y SE ANULAR");
        }
    }

    public AlfrescoController getAlfrescoController() {
        return alfrescoController;
    }

    public void setAlfrescoController(AlfrescoController alfrescoController) {
        this.alfrescoController = alfrescoController;
    }

    public String getCsolicitud() {
        return csolicitud;
    }

    public void setCsolicitud(String csolicitud) {
        this.csolicitud = csolicitud;
    }

    public TgeneCatalogDetail getNombreTramite() {
        return nombreTramite;
    }

    public void setNombreTramite(TgeneCatalogDetail nombreTramite) {
        this.nombreTramite = nombreTramite;
    }

    public TgeneCatalogDetail getNombreCategoria() {
        return nombreCategoria;
    }

    public void setNombreCategoria(TgeneCatalogDetail nombreCategoria) {
        this.nombreCategoria = nombreCategoria;
    }

    public TgeneCatalogDetail getNombreUsoActividad() {
        return nombreUsoActividad;
    }

    public void setNombreUsoActividad(TgeneCatalogDetail nombreUsoActividad) {
        this.nombreUsoActividad = nombreUsoActividad;
    }

    public TarmSolicitud getSolicitud() {
        return solicitud;
    }

    public void setSolicitud(TarmSolicitud solicitud) {
        this.solicitud = solicitud;
    }

    public Boolean getIsDenied() {
        return isDenied;
    }

    public void setIsDenied(Boolean isDenied) {
        this.isDenied = isDenied;
    }

    public Boolean getIsOnlyMsj() {
        return isOnlyMsj;
    }

    public void setIsOnlyMsj(Boolean isOnlyMsj) {
        this.isOnlyMsj = isOnlyMsj;
    }

    public List<TgeneCatalogDetail> getAccionList() {
        return accionList;
    }

    public void setAccionList(List<TgeneCatalogDetail> accionList) {
        this.accionList = accionList;
    }

    public String getAccionTomada() {
        return accionTomada;
    }

    public void setAccionTomada(String accionTomada) {
        this.accionTomada = accionTomada;
    }

    public void aceptar() {
        if (record.getValorapagar().compareTo(record.getValorverificado()) != 0) {
            accionTomada = REPROBAR;
            isDenied = true;
        } else {
            accionTomada = "";
            isDenied = false;
        }
    }

}
