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

import java.util.ArrayList;
import java.util.Date;
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.TarmUnidadTipo;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

/**
 * Clase controladora del bean TarmUnidTipo.
 *
 * @author C.P.
 * @version 2
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class UnidadTipoController extends AbstractController<TarmUnidadTipo> {

    /**
     * catalogo de las unidades
     */
    private List<TgeneCatalogDetail> lunidades;
    /**
     * atributo para la descripcion de la clase del arma
     */
    private String descripcionClase;
    /**
     * atributo para la descripcion del tipo del arma
     */
    private String descripcionTipoArma;

    public UnidadTipoController() throws Exception {
        super(TarmUnidadTipo.class);
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        lunidades = CatalogDetailController.find("UNIDADMEDIDA");
        // Inicializa autoconsulta
        super.startQuery();

    }

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

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

            SubQuery sclasearma = new SubQuery("TgeneCatalogDetail", "description", "desclasearma", "i.pk.catalog = t.pk.clase and  i.pk.catalogcode=t.pk.clasecode");
            SubQuery stipoarma = new SubQuery("TgeneCatalogDetail", "description", "destipoarma", "i.pk.catalog = t.pk.tipoarmaexplosivo and  i.pk.catalogcode=t.pk.tipoarmaexplosivocodigo");
            SubQuery sunidad = new SubQuery("TgeneCatalogDetail", "description", "desunidad", "i.pk.catalog = t.pk.unidadmedidapeso and  i.pk.catalogcode=t.pk.unidadmedidapesocodigo");

            dto.addSubQuery(stipoarma);
            dto.addSubQuery(sclasearma);
            dto.addSubQuery(sunidad);

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto);

            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<TarmUnidadTipo>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmUnidadTipo>) resp
                        .get(this.beanalias);
                super.postQuery(this.lrecord);
            }

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

    @SuppressWarnings("unchecked")
    protected void querydatabaseSimple() {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto);

            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<TarmUnidadTipo>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmUnidadTipo>) resp
                        .get(this.beanalias);
                super.postQuery(this.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 = 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);
        }
    }

    /**
     * Crea una instancia del registro como nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
    }

    @Override
    public void update() throws Exception {
        if (record.getModifiedData().get("desclasearma") == null || record.getModifiedData().get("desclasearma").toString().trim().length() == 0) {
            MessageHelper.setMessageError("SELECCIONE LA CLASE");
            return;
        }
        if (record.getModifiedData().get("destipoarma") == null || record.getModifiedData().get("destipoarma").toString().trim().length() == 0) {
            MessageHelper.setMessageError("SELECCIONE EL TIPO DE ARMA");
            return;
        }
        this.record.getPk().setUnidadmedidapesocodigo("UNIDADMEDIDA");
        record.setFecharegistro(new java.sql.Date(new Date().getTime()));
        catalogos(lunidades, record.getPk().getUnidadmedidapeso(), "desunidad");
        super.update();
    }

    public void update(TarmUnidadTipo bean) throws Exception {
        record = bean;
        super.update();
    }

    /**
     * Metodo para recorreer los combos y setear las descripciones de lo q se
     * escoge para la vista
     *
     * @param list
     * @param codigo
     * @param pk
     */
    public void catalogos(List<TgeneCatalogDetail> list, String codigo, String pk) {
        for (TgeneCatalogDetail item : list) {
            if (codigo.equals(item.getPk().getCatalog())) {
                record.modifiedData.put(pk, item.getDescription());
                break;
            }
        }
    }

    public void openClaseLov() {
        Map<String, List<String>> params = new HashMap<>();
        List<String> lcat = new ArrayList<>();
        lcat.add("CLASE");
        params.put("catalogcode", lcat);
        List<String> ldescripcion = new ArrayList<>();
        ldescripcion.add(MsgControlArmas.getProperty("lvh_clase"));
        params.put("tituloLOV", ldescripcion);
        ClaseLovController.openLov(params);

    }

    private String codigoClase;

    public void openTipoArmaLov() {
        if (codigoClase == null || codigoClase.trim().length() == 0) {
            MessageHelper.setMessageError("SELECCIONE LA CLASE");
            return;
        }
        Map<String, List<String>> params = new HashMap<>();
        String codigoslonguitud = "";
        String codigoslonguitud2 = "";
        List<TgeneCatalogDetail> lista = CatalogDetailController.find("LONGITUD", codigoClase);
        if (lista != null) {
            for (TgeneCatalogDetail catalogo : lista) {
                if (codigoslonguitud == null || codigoslonguitud.length() == 0) {
                    codigoslonguitud += catalogo.getPk().getCatalog();
                } else if (codigoslonguitud2 == null || codigoslonguitud2.length() == 0) {
                    codigoslonguitud2 += "  legalcode= '" + catalogo.getPk().getCatalog() + "'";
                } else {
                    codigoslonguitud2 += " or t.legalcode= '" + catalogo.getPk().getCatalog() + "'";
                }
            }
        }
        List<String> l = new ArrayList<>();
        if (codigoslonguitud != null && codigoslonguitud.length() > 0) {
            l.add(codigoslonguitud);
        } else {
            l.add(codigoClase);
        }
        params.put("legalcode", l);

        List<String> l2 = new ArrayList<>();
        if (codigoslonguitud2 != null && codigoslonguitud2.length() > 0) {
            l2.add(codigoslonguitud2);
        }
        params.put("legalcode2", l2);
        List<String> lcat = new ArrayList<>();
        lcat.add("TIPOARMAEXPLOSIVO");
        params.put("catalogcode", lcat);

        List<String> ldescripcion = new ArrayList<>();
        ldescripcion.add(MsgControlArmas.getProperty("lvh_tipoarma"));
        params.put("tituloLOV", ldescripcion);
        ClaseLovController.openLov(params);

    }

    private String codigoClaseD;

    public void openTipoArmaDialogLov() {
        if (codigoClaseD == null || codigoClaseD.trim().length() == 0) {
            MessageHelper.setMessageError("SELECCIONE LA CLASE");
            return;
        }
        Map<String, List<String>> params = new HashMap<>();
        String codigoslonguitud = "";
        String codigoslonguitud2 = "";
        List<TgeneCatalogDetail> lista = CatalogDetailController.find("LONGITUD", codigoClaseD);
        if (lista != null) {
            for (TgeneCatalogDetail catalogo : lista) {
                if (codigoslonguitud == null || codigoslonguitud.length() == 0) {
                    codigoslonguitud += catalogo.getPk().getCatalog();
                } else if (codigoslonguitud2 == null || codigoslonguitud2.length() == 0) {
                    codigoslonguitud2 += "  legalcode= '" + catalogo.getPk().getCatalog() + "'";
                } else {
                    codigoslonguitud2 += " or t.legalcode= '" + catalogo.getPk().getCatalog() + "'";
                }
            }
        }
        List<String> l = new ArrayList<>();
        if (codigoslonguitud != null && codigoslonguitud.length() > 0) {
            l.add(codigoslonguitud);
        } else {
            l.add(codigoClaseD);
        }
        params.put("legalcode", l);

        List<String> l2 = new ArrayList<>();
        if (codigoslonguitud2 != null && codigoslonguitud2.length() > 0) {
            l2.add(codigoslonguitud2);
        }
        params.put("legalcode2", l2);
        List<String> lcat = new ArrayList<>();
        lcat.add("TIPOARMAEXPLOSIVO");
        params.put("catalogcode", lcat);

        List<String> ldescripcion = new ArrayList<>();
        ldescripcion.add(MsgControlArmas.getProperty("lvh_tipoarma"));
        params.put("tituloLOV", ldescripcion);
        ClaseLovController.openLov(params);

    }

    public void onReturnClaseLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.getMfilters().put("pk.clase", t.getPk().getCatalog());
        descripcionClase = t.getDescription();
        codigoClase = t.getPk().getCatalog();
        //encero
        super.getMfilters().put("pk.tipoarmaexplosivo", null);
        descripcionTipoArma = null;
    }

    public void onReturnTipoArmaLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        super.getMfilters().put("pk.tipoarmaexplosivo", t.getPk().getCatalog());
        descripcionTipoArma = t.getDescription();
    }

    public void onReturnClaseDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        record.getPk().setClase(t.getPk().getCatalog());
        record.getPk().setClasecode(t.getPk().getCatalogcode());
        record.getModifiedData().put("desclasearma", t.getDescription());
        codigoClaseD = t.getPk().getCatalog();
        //encero
        record.getPk().setTipoarmaexplosivo(null);
        record.getPk().setTipoarmaexplosivocodigo(null);
        record.getModifiedData().put("destipoarma", null);
    }

    public void onReturnTipoArmaDialogLov(SelectEvent event) throws Exception {
        TgeneCatalogDetail t = (TgeneCatalogDetail) event.getObject();
        record.getPk().setTipoarmaexplosivo(t.getPk().getCatalog());
        record.getPk().setTipoarmaexplosivocodigo(t.getPk().getCatalogcode());
        record.getModifiedData().put("destipoarma", t.getDescription());
//		codigoClase=t.getPk().getCatalog();
    }

    /**
     * Entrega una lista de objetos TgeneCatalogDetail
     *
     * @param catalogcode C&oacute de cat&aacute;logo
     * @return lrecord Lista de objetos TgeneCatalogDetail
     */
    public static List<TarmUnidadTipo> find(String catalogcode) {
        try {
            UnidadTipoController cc = new UnidadTipoController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk", catalogcode);
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    /**
     * Obtiene un tipo de unidad por la clase y el codigo de clase
     */
    public static TarmUnidadTipo findByClaseAndClasecode(String clase, String clasecode, String tipoArmaExplosivo, String unidadMedida) {
        try {
            UnidadTipoController cc = new UnidadTipoController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk.clase", clase);
            cc.addFilter("pk.clasecode", clasecode);
            cc.addFilter("pk.tipoarmaexplosivo", tipoArmaExplosivo);
            cc.addFilter("pk.unidadmedidapeso", unidadMedida);
            cc.querydatabaseSimple();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public static TarmUnidadTipo find(String clase, String tipoarmaexplosivo) {
        try {
            UnidadTipoController cc = new UnidadTipoController();
            cc.init();
            cc.recperpage = 300;
            cc.addFilter("pk.clase", clase);
            cc.addFilter("pk.tipoarmaexplosivo", tipoarmaexplosivo);
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public List<TgeneCatalogDetail> getLunidades() {
        return lunidades;
    }

    public void setLunidades(List<TgeneCatalogDetail> lunidades) {
        this.lunidades = lunidades;
    }

    public String getDescripcionClase() {
        return descripcionClase;
    }

    public void setDescripcionClase(String descripcionClase) {
        this.descripcionClase = descripcionClase;
    }

    public String getDescripcionTipoArma() {
        return descripcionTipoArma;
    }

    public void setDescripcionTipoArma(String descripcionTipoArma) {
        this.descripcionTipoArma = descripcionTipoArma;
    }

}
