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.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;
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.Filter;
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.persistence.parmas.param.TarmOrigenTramite;
import com.fp.persistence.parmas.param.TarmOrigenTramiteKey;
import com.fp.persistence.parmas.param.TarmTipoTramite;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

/**
 * Clase controladora de ingreso de tramites de control de armas.
 *
 * @author Jorge Vaca.
 * @author dcruz
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class OrigenTramiteController extends AbstractController<TarmOrigenTramite> {

    private TarmTipoTramite tipoTramite;
    private String origenAdquisicion;
    private String tipoPersona;
    private String tipoDeTramite;
    private String tipoAutorizacion;
    private String categoria;
    private String actividad;
    private String tipoDeTramiteD;
    private String tipoAutorizacionD;
    private String categoriaD;
    private String actividadD;
    private String origenAdquisicionD;
    /**
     * Tr&aacute;mite seleccionado
     */
    private TarmTramite tarmTramite;

    /**
     * Lista de origen de adquisici&oacute;n
     */
    private List<TgeneCatalogDetail> lorigenadquisicion;

    public OrigenTramiteController() throws Exception {
        super(TarmOrigenTramite.class);
    }

    @PostConstruct
    private void postconstruct() {
        try {
            init();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     *
     * @throws Exception
     */
    private void init() throws Exception {
        try {
            this.beanalias = "ORIGENTRAMITE";
            this.recperpage = 15; // Cambiar al # reg a mirar.		
            this.lrecord = new ArrayList<TarmOrigenTramite>();
            this.record = new TarmOrigenTramite();
            this.record.setPk(new TarmOrigenTramiteKey());
            lorigenadquisicion = CatalogDetailController.find("ORIGENADQUISICION");
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void save() {
        try {
            DtoSave dtosave = super.getDtoSave();
            dtosave.setReturnpk(true); // Para que el core devuelva el pk de los registros nuevos.
            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);
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    protected void querydatabase() {
        try {
            if ((this.origenAdquisicion == null || this.origenAdquisicion.equals("")) && this.tarmTramite == null) {
                MessageHelper.setMessageError("DEBE SELECCIONAR UN TRAMITE O UN ORIGEN DE ADQUISICIÓN PARA REALIZAR LA BUSQUEDA");
                return;
            }

            Boolean existeFiltro = Boolean.FALSE;
            DtoQuery dto = super.getDtoQuery(true);

            SubQuery tramiteSQ = new SubQuery("TgeneCatalogDetail", "description", "tipoAutorizacion",
                    "i.pk.catalog = (select a.tipoautorizacion from TarmTramite a where a.pk = t.pk.ctramite) "
                    + " and "
                    + "i.pk.catalogcode = (select a.tipoautorizacioncodigo from TarmTramite a where a.pk = t.pk.ctramite)");
            dto.addSubQuery(tramiteSQ);

            SubQuery tipoTramiteSQ = new SubQuery("TgeneCatalogDetail", "description", "tipoDeTramite",
                    "i.pk.catalog = (select a.tipotramite from TarmTramite a where a.pk = t.pk.ctramite) "
                    + " and "
                    + "i.pk.catalogcode = (select a.tipotramitecodigo from TarmTramite a where a.pk = t.pk.ctramite)");
            dto.addSubQuery(tipoTramiteSQ);

            SubQuery categoriaSQ = new SubQuery("TgeneCatalogDetail", "description", "categoria",
                    "i.pk.catalog = (select a.categoria from TarmTramite a where a.pk = t.pk.ctramite) "
                    + " and "
                    + "i.pk.catalogcode = (select a.categoriacodigo from TarmTramite a where a.pk = t.pk.ctramite)");
            dto.addSubQuery(categoriaSQ);

            SubQuery usoActividadSQ = new SubQuery("TgeneCatalogDetail", "description", "actividad",
                    "i.pk.catalog = (select a.usoactividad from TarmTramite a where a.pk = t.pk.ctramite) "
                    + " and "
                    + "i.pk.catalogcode = (select a.usoactividadcodigo from TarmTramite a where a.pk = t.pk.ctramite)");
            dto.addSubQuery(usoActividadSQ);

            SubQuery adquisicionSQ = new SubQuery("TgeneCatalogDetail", "description", "adquisicion",
                    "i.pk.catalog = t.pk.origencatalog and i.pk.catalogcode = t.pk.origencatalogcode");
            dto.addSubQuery(adquisicionSQ);

            Filter filtro = new Filter();
            StringBuilder sql = new StringBuilder();
            if (this.origenAdquisicion != null && !this.origenAdquisicion.equals("")) {
                sql.append("t.pk.origencatalog='" + this.origenAdquisicion + "'");
                existeFiltro = Boolean.TRUE;
            }
            if (this.tarmTramite != null) {
                if (this.origenAdquisicion != null && !this.origenAdquisicion.equals("")) {
                    sql.append(" and ");
                }
                sql.append("t.pk.ctramite='" + this.tarmTramite.getPk() + "'");
                existeFiltro = Boolean.TRUE;
            }
            if (existeFiltro) {
                filtro.setSql(sql.toString());
                dto.addFiltro(filtro);
            }

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

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

            Response resp = this.callerhelper.executeQuery(request);

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

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

    protected void querydatabasesimple() {
        try {

            Boolean existeFiltro = Boolean.FALSE;
            DtoQuery dto = super.getDtoQuery(true);
            Filter filtro = new Filter();
            StringBuilder sql = new StringBuilder();

            if (this.tarmTramite != null) {
                sql.append("t.pk.ctramite='" + this.tarmTramite.getPk() + "'");
                existeFiltro = Boolean.TRUE;
            }
            if (existeFiltro) {
                filtro.setSql(sql.toString());
                dto.addFiltro(filtro);
            }

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

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

            Response resp = this.callerhelper.executeQuery(request);

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

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

    /**
     * Abre el LOV de tr&aacute;mite
     */
    public void openLovTramite() {
        Map<String, List<String>> params = new HashMap<String, List<String>>();
        List<String> ltipopersona = new ArrayList<>();

//			ltipopersona.add(ParametersController.find("CODIGO.PERSONTYPE.NATURAL", "1").getTextvalue());//1
//	
//			ltipopersona.add(ParametersController.find("CODIGO.PERSONTYPE.JURIDICA", "1").getTextvalue());//2
//		
//	
//		params.put("tipopersonasol", ltipopersona);
        BuscarTramiteLovController.openLov(params);
    }

    /**
     * Regresa del LOV para cargar valores
     *
     * @param event {@link SelectEvent}
     */
    public void onReturnTramite(SelectEvent event) {
        try {
            TarmTramite tramite = (TarmTramite) event.getObject();
            this.tarmTramite = tramite;
            TgeneCatalogDetail tipoTramiteCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
            TgeneCatalogDetail tipoAutorizacionCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
            TgeneCatalogDetail categoriaCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
            TgeneCatalogDetail actividadCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
            tipoDeTramite = tipoTramiteCD != null ? tipoTramiteCD.getDescription() : "";
            tipoAutorizacion = tipoAutorizacionCD != null ? tipoAutorizacionCD.getDescription() : "";
            categoria = categoriaCD != null ? categoriaCD.getDescription() : "";
            actividad = actividadCD != null ? actividadCD.getDescription() : "";
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Regresa del LOV para cargar valores
     *
     * @param event {@link SelectEvent}
     */
    public void onReturnTramiteDialog(SelectEvent event) {
        try {
            TarmTramite tramite = (TarmTramite) event.getObject();
            this.tarmTramite = tramite;
            TgeneCatalogDetail tipoTramiteCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipotramite(), tramite.getTipotramitecodigo());
            TgeneCatalogDetail tipoAutorizacionCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getTipoautorizacion(), tramite.getTipoautorizacioncodigo());
            TgeneCatalogDetail categoriaCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getCategoria(), tramite.getCategoriacodigo());
            TgeneCatalogDetail actividadCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
            TgeneCatalogDetail adquisicionCD = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
            record.getModifiedData().put("tipoDeTramite", tipoTramiteCD != null ? tipoTramiteCD.getDescription() : "");
            record.getModifiedData().put("tipoAutorizacion", tipoAutorizacionCD != null ? tipoAutorizacionCD.getDescription() : "");
            record.getModifiedData().put("categoria", categoriaCD != null ? categoriaCD.getDescription() : "");
            record.getModifiedData().put("actividad", actividadCD != null ? actividadCD.getDescription() : "");
            record.getModifiedData().put("adquisicion", adquisicionCD != null ? adquisicionCD.getDescription() : "");
            this.record.getPk().setCtramite(tramite.getPk());
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Regresa del LOV para cargar valores
     *
     * @param tarmTramite Tarm Tramite
     * @param event {@link SelectEvent}
     */
    public static List<TarmOrigenTramite> findOrigenTramite(TarmTramite tarmTramite) {
        try {
            OrigenTramiteController cc = new OrigenTramiteController();
            cc.init();
            cc.recperpage = 1000;
            cc.setTarmTramite(tarmTramite);
            cc.querydatabasesimple();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;

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

    /**
     * Actualiza la lista de registros a grabar
     *
     * @throws Exception
     */
    public void update() throws Exception {

        if (this.record.getPk().getCtramite() == null) {
            MessageHelper.setMessageError("DEBE SELECCIONAR UN TRAMITE", "formOrigenTramiteDialog");
            return;
        }

        this.record.getPk().setOrigencatalogcode("ORIGENADQUISICION");
        TgeneCatalogDetail adquisicionCD = CatalogDetailController.findxCodigoCodcatalogo(this.record.getPk().getOrigencatalog(), this.record.getPk().getOrigencatalogcode());
        record.getModifiedData().put("adquisicion", adquisicionCD != null ? adquisicionCD.getDescription() : "");
        super.update();
        tarmTramite = null;
        origenAdquisicion = null;
    }

    public TarmTipoTramite getTipoTramite() {
        return tipoTramite;
    }

    public void setTipoTramite(TarmTipoTramite tipoTramite) {
        this.tipoTramite = tipoTramite;
    }

    public String getOrigenAdquisicion() {
        return origenAdquisicion;
    }

    public void setOrigenAdquisicion(String origenAdquisicion) {
        this.origenAdquisicion = origenAdquisicion;
    }

    public List<TgeneCatalogDetail> getLorigenadquisicion() {
        return lorigenadquisicion;
    }

    public void setLorigenadquisicion(List<TgeneCatalogDetail> lorigenadquisicion) {
        this.lorigenadquisicion = lorigenadquisicion;
    }

    public String getTipoPersona() {
        return tipoPersona;
    }

    public void setTipoPersona(String tipoPersona) {
        this.tipoPersona = tipoPersona;
    }

    public TarmTramite getTarmTramite() {
        return tarmTramite;
    }

    public void setTarmTramite(TarmTramite tarmTramite) {
        this.tarmTramite = tarmTramite;
    }

    public String getTipoAutorizacion() {
        return tipoAutorizacion;
    }

    public void setTipoAutorizacion(String tipoAutorizacion) {
        this.tipoAutorizacion = tipoAutorizacion;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    public String getActividad() {
        return actividad;
    }

    public void setActividad(String actividad) {
        this.actividad = actividad;
    }

    public String getTipoDeTramite() {
        return tipoDeTramite;
    }

    public void setTipoDeTramite(String tipoDeTramite) {
        this.tipoDeTramite = tipoDeTramite;
    }

    public String getTipoDeTramiteD() {
        return tipoDeTramiteD;
    }

    public void setTipoDeTramiteD(String tipoDeTramiteD) {
        this.tipoDeTramiteD = tipoDeTramiteD;
    }

    public String getTipoAutorizacionD() {
        return tipoAutorizacionD;
    }

    public void setTipoAutorizacionD(String tipoAutorizacionD) {
        this.tipoAutorizacionD = tipoAutorizacionD;
    }

    public String getCategoriaD() {
        return categoriaD;
    }

    public void setCategoriaD(String categoriaD) {
        this.categoriaD = categoriaD;
    }

    public String getActividadD() {
        return actividadD;
    }

    public void setActividadD(String actividadD) {
        this.actividadD = actividadD;
    }

    public String getOrigenAdquisicionD() {
        return origenAdquisicionD;
    }

    public void setOrigenAdquisicionD(String origenAdquisicionD) {
        this.origenAdquisicionD = origenAdquisicionD;
    }

}
