package com.fp.frontend.controller.armas.parametros;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.primefaces.event.SelectEvent;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.SubQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.persistence.parmas.param.TarmTipoSancion;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

/**
 * Clase controladora del bean TarmTipoSancion.
 *
 * @author Christian Pazmino
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class DatosParaSancionesController extends AbstractController<TarmTipoSancion> {

    /**
     * Lista de tipos de tramites a ser seleccionados por el usuario
     * (Autorizacion, Permiso)
     */
    private List<TgeneCatalogDetail> tramiteList;
    /**
     * Lista de tipos de faltas a ser seleccionadados por el usuario (Leve,
     * Grave, etc)
     */
    private List<TgeneCatalogDetail> tipoDeFaltaList;
    /**
     * Lista de tipos de sanciones a ser seleccionados por el usuario
     * (Suspencion, Decomiso, etc)
     */
    private List<TgeneCatalogDetail> sancionList;
    /**
     * Lista de periodos en dias que durara la sancion (180 dias, 270 dias, etc)
     */
    private List<TgeneCatalogDetail> tiempoList;
    /**
     * Codigo de la clase seleccionada por el usuario
     */
    private String claseFiltroStr;
    /**
     * Variable que indica si el usuario esta negado para continuar en la
     * pantalla
     */
    private Boolean esEdicionBln;
    /**
     * Constante usada para referirse al catalogo de tipo de falta
     */
    private final String TIPOFALTACODIGO = "TIPODEFALTA";
    /**
     * Constante usada para referirse al catalogo de vigencia en dias
     */
    private final String TIEMPOCODIGO = "VIGENCIADIAS";
    /**
     * Constante usada para referirse al catalogo de sanciones
     */
    private final String SANCIONCODIGO = "SANCION";
    /**
     * Constante usada para referirse al catalogo de tipo autorizacion
     */
    private final String TRAMITECODIGO = "TIPOAUTORIZACION";

    public DatosParaSancionesController() throws Exception {
        super(TarmTipoSancion.class);
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        record = new TarmTipoSancion();
        tipoDeFaltaList = CatalogDetailController.find("TIPODEFALTA");
        tramiteList = CatalogFilterLovController.findTramiteSancion();
        tiempoList = CatalogDetailController.find("VIGENCIADIAS");
        sancionList = CatalogDetailController.find("SANCION");
        esEdicionBln = Boolean.FALSE;
        super.startQuery();

    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            recperpage = 15; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<>();
            beanalias = "DATOSPARASANCION";
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo utilizado al escoger tipo de falta
     */
    public void changeTipoFalta() {
        for (TgeneCatalogDetail r : tipoDeFaltaList) {
            if (r.getPk().getCatalog().compareTo(record.getTipofalta()) == 0) {
                record.put("ntipoFalta", r.getDescription());
                break;
            }
        }
        record.setTipofaltacodigo(TIPOFALTACODIGO);
    }

    /**
     * Metodo utilizado al escoger tramite
     */
    public void changeTramite() {
        for (TgeneCatalogDetail r : tramiteList) {
            if (r.getPk().getCatalog().compareTo(record.getTramite()) == 0) {
                record.put("ntramite", r.getDescription());
                break;
            }
        }
        record.setTramitecodigo(TRAMITECODIGO);
    }

    /**
     * Metodo utilizado al escoger sancion
     */
    public void changeSancion() {
        for (TgeneCatalogDetail r : sancionList) {
            if (r.getPk().getCatalog().compareTo(record.getSancion()) == 0) {
                record.put("nsancion", r.getDescription());
                break;
            }
        }
        record.setSancioncodigo(SANCIONCODIGO);
    }

    /**
     * Metodo utilizado al escoger tiempo
     */
    public void changeTiempo() {
        for (TgeneCatalogDetail r : tiempoList) {
            if (r.getPk().getCatalog().compareTo(record.getTiempo()) == 0) {
                record.put("ntiempo", r.getDescription());
                break;
            }
        }
        record.setTiempocodigo(TIEMPOCODIGO);
    }

    /**
     * Crea una instancia de TgeneTransactionProcess y marca el registro como
     * nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
//		if(!esEdicionBln){
//			record.setNumeropregunta(null);
//		}else{
//			record.setNumeropregunta(record.getNumeropregunta());
//		}
        esEdicionBln = Boolean.FALSE;
        super.addField("claseDescriptionD", null);
        super.addField("faltaDescriptionD", null);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void querydatabase() {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            dto.setOrderby("t.pk");

            // Subquery			
            SubQuery subqueryClase = new SubQuery("TgeneCatalogDetail", "description", "nclase", "i.pk.catalog = t.clase and i.pk.catalogcode = t.clasecodigo");
            dto.addSubQuery(subqueryClase);

            SubQuery subqueryFalta = new SubQuery("TgeneCatalogDetail", "description", "nfalta", "i.pk.catalog = t.falta and i.pk.catalogcode = t.faltacodigo");
            dto.addSubQuery(subqueryFalta);

            SubQuery subqueryTipoFalta = new SubQuery("TgeneCatalogDetail", "description", "ntipoFalta", "i.pk.catalog = t.tipofalta and i.pk.catalogcode = t.tipofaltacodigo");
            dto.addSubQuery(subqueryTipoFalta);

            SubQuery subqueryTramite = new SubQuery("TgeneCatalogDetail", "description", "ntramite", "i.pk.catalog = t.tramite and i.pk.catalogcode = t.tramitecodigo");
            dto.addSubQuery(subqueryTramite);

            SubQuery subquerySancion = new SubQuery("TgeneCatalogDetail", "description", "nsancion", "i.pk.catalog = t.sancion and i.pk.catalogcode = t.sancioncodigo");
            dto.addSubQuery(subquerySancion);

            SubQuery subqueryTiempo = new SubQuery("TgeneCatalogDetail", "description", "ntiempo", "i.pk.catalog = t.tiempo and i.pk.catalogcode = t.tiempocodigo");
            dto.addSubQuery(subqueryTiempo);

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(beanalias, dto); // permite adicionar mas de una tabla.

            Request request = callerhelper.getRequest();
            request.setQueryTables(mtables);

            Response resp = callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                lrecord = new ArrayList<TarmTipoSancion>();
                MessageHelper.setMessageError(resp);
            } else {
                lrecord = (List<TarmTipoSancion>) resp.get(beanalias);
                super.postQuery(lrecord);
            }

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

    @Override
    public void save() {
        try {

            DtoSave dtosave = super.getDtoSave();
            if (!dtosave.pendingProcess()) {
                return;
            }
            dtosave.setReturnpk(true); // Para que el core devuelva el pk de los
            // registros nuevos.
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

            Request request = callerhelper.getRequest();
            msave.put(beanalias, dtosave); // adicionar metadata de
            // mantenimiento para cada tabla.

            request.setSaveTables(msave);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }

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

    @Override
    public void postCommit(Response response) throws Exception {
        super.postCommitGeneric(response, beanalias);
    }

    /**
     * Metodo usado para abrir el dialogo de falta en de la pantalla
     * crear/editar
     */
    public void openFaltaDialogLov() {
        try {
            if (this.record.getClase() != null) {
                Map<String, List<String>> params = new HashMap<>();
                //Codigo de catalogcode
                List<String> lcatalogcode = new ArrayList<>();
                lcatalogcode.add("FALTA");
                params.put("catalogcode", lcatalogcode);
                //tITULO DEL LOV
                List<String> ltituloLOV = new ArrayList<>();
                ltituloLOV.add("lov_falta");
                params.put("tituloLOV", ltituloLOV);
                //Filtro
                List<String> lfiltro = new ArrayList<>();

                if (this.record.getClase().equals("0010000001") || this.record.getClase().equals("0010000002")) {
                    //Filtro para armas de fuego y municiones
                    lfiltro.add("t.legalcode = 'ARMASYMUNICIONES'");
                }//
                else if (this.record.getClase().equals("0010000003") || this.record.getClase().equals("0010000007")) {
                    //Filtro para explosivos y pirotecnicos
                    lfiltro.add("t.legalcode = 'EXPLOSIVOSYPIROTECNICOS'");
                } else if (this.record.getClase().equals("0010000004")) {
                    //Filtro para accesorios
                    lfiltro.add("t.legalcode = 'ACCESORIOS'");
                } else if (this.record.getClase().equals("0010000006")) {
                    //Filtro para accesorios
                    lfiltro.add("t.legalcode = 'ACCESORIOS'");
                }
                params.put("filtro", lfiltro);
                CatalogFilterLovController.openLov(params);
                //ClaseLovController.openLov(params);  
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionClase"));
            }
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo de consulta de datos para sanciones segun la clase pasada como
     * parametro
     */
    public static List<TarmTipoSancion> find(String clase) {
        try {
            DatosParaSancionesController cc = new DatosParaSancionesController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("clase", clase);

            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Metodo de consulta de dato para sancion segun la clave primaria pasada
     * como parametro
     */
    public static TarmTipoSancion findxPk(String pk) {
        try {
            DatosParaSancionesController cc = new DatosParaSancionesController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk", pk);

            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Metodo usado para abrir el dialogo de seleccionar falta en de la pantalla
     * principal
     */
    public void openFaltaLov() {
        try {
            if (claseFiltroStr != null) {
                Map<String, List<String>> params = new HashMap<>();
                //Codigo de catalogcode
                List<String> lcatalogcode = new ArrayList<>();
                lcatalogcode.add("FALTA");
                params.put("catalogcode", lcatalogcode);
                //tITULO DEL LOV
                List<String> ltituloLOV = new ArrayList<>();
                ltituloLOV.add("lov_falta");
                params.put("tituloLOV", ltituloLOV);
                //Filtro
                List<String> lfiltro = new ArrayList<>();

                if (claseFiltroStr.equals("0010000001") || claseFiltroStr.equals("0010000002")) {
                    //Filtro para armas de fuego y municiones
                    lfiltro.add("t.legalcode = 'ARMASYMUNICIONES'");
                }//
                else if (claseFiltroStr.equals("0010000003") || claseFiltroStr.equals("0010000007")) {
                    //Filtro para explosivos y pirotecnicos
                    lfiltro.add("t.legalcode = 'EXPLOSIVOSYPIROTECNICOS'");
                } else if (claseFiltroStr.equals("0010000004")) {
                    //Filtro para accesorios
                    lfiltro.add("t.legalcode = 'ACCESORIOS'");
                } else if (claseFiltroStr.equals("0010000006")) {
                    //Filtro para accesorios
                    lfiltro.add("t.legalcode = 'ACCESORIOS'");
                }
                params.put("filtro", lfiltro);
                CatalogFilterLovController.openLov(params);
                //ClaseLovController.openLov(params);  
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_seleccionClase"));
            }
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * falta de la pantalla principal
     */
    public void onReturnFaltaLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addFilter("falta", t.getPk().getCatalog());
        super.addFilter("faltacodigo", t.getPk().getCatalogcode());
        super.addField("faltaDescription", t.getDescription());
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * falta de la pantalla crear/editar
     */
    public void onReturnFaltaDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addField("faltaDescriptionD", t.getDescription());
        this.record.setFalta(t.getPk().getCatalog());
        this.record.setFaltacodigo(t.getPk().getCatalogcode());
        record.put("nfalta", t.getDescription());
    }

    /**
     * Metodo usado para abrir el dialogo de seleccionar clase en de la pantalla
     * principal
     */
    public void openClaseLov() {
        try {
            Map<String, List<String>> params = new HashMap<>();
            //Codigo de catalogcode
            List<String> lcatalogcode = new ArrayList<>();
            lcatalogcode.add("CLASE");
            params.put("catalogcode", lcatalogcode);
            //tITULO DEL LOV
            List<String> ltituloLOV = new ArrayList<>();
            ltituloLOV.add("lvh_clase");
            params.put("tituloLOV", ltituloLOV);
            //Filtro
//			List<String> lfiltro = new ArrayList<>();
//			lfiltro.add("t.pk.catalog in ('0010000001','0010000002','0010000003','0010000007','0010000004','0010000006')");		
//			params.put("filtro", lfiltro);
            CatalogFilterLovController.openLov(params);
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * clase de la pantalla principal
     */
    public void onReturnClaseLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        claseFiltroStr = t.getPk().getCatalog();
        super.addFilter("clase", t.getPk().getCatalog());
        super.addFilter("clasecodigo", t.getPk().getCatalogcode());
        super.addField("claseDescription", t.getDescription());
        this.query();
    }

    /**
     * Metodo usado para completar acciones al cerrar el dialogo seleccionar
     * clase de la pantalla crear/editar
     */
    public void onReturnClaseDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.addField("claseDescriptionD", t.getDescription());
        super.addField("faltaDescriptionD", null);
        record.setFalta(null);
        this.record.setClase(t.getPk().getCatalog());
        this.record.setClasecodigo(t.getPk().getCatalogcode());
        record.put("nclase", t.getDescription());
    }

    @Override
    public void update() throws Exception {
        if (record.getClase() != null) {
            if (record.getFalta() != null) {
                super.update();
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_faltaRequerido"));
            }
        } else {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_claseRequerido"));
        }
    }

    /**
     * Metodo que actualiza las descripciones seleccionadas en el dialogo
     * crear/editar a la variable record y marca una bandera ser edicion
     */
    public void actualizar() {
        esEdicionBln = Boolean.TRUE;
        super.addField("claseDescriptionD", record.get("nclase"));
        super.addField("faltaDescriptionD", record.get("nfalta"));
    }

    public List<TgeneCatalogDetail> getTramiteList() {
        return tramiteList;
    }

    public void setTramiteList(List<TgeneCatalogDetail> tramiteList) {
        this.tramiteList = tramiteList;
    }

    public List<TgeneCatalogDetail> getTipoDeFaltaList() {
        return tipoDeFaltaList;
    }

    public void setTipoDeFaltaList(List<TgeneCatalogDetail> tipoDeFaltaList) {
        this.tipoDeFaltaList = tipoDeFaltaList;
    }

    public List<TgeneCatalogDetail> getSancionList() {
        return sancionList;
    }

    public void setSancionList(List<TgeneCatalogDetail> sancionList) {
        this.sancionList = sancionList;
    }

    public List<TgeneCatalogDetail> getTiempoList() {
        return tiempoList;
    }

    public void setTiempoList(List<TgeneCatalogDetail> tiempoList) {
        this.tiempoList = tiempoList;
    }

    public Boolean getEsEdicionBln() {
        return esEdicionBln;
    }

    public void setEsEdicionBln(Boolean esEdicionBln) {
        this.esEdicionBln = esEdicionBln;
    }

    public String getClaseFiltroStr() {
        return claseFiltroStr;
    }

    public void setClaseFiltroStr(String claseFiltroStr) {
        this.claseFiltroStr = claseFiltroStr;
    }

}
