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

import java.util.ArrayList;
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 javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.component.selectbooleancheckbox.SelectBooleanCheckbox;
import org.primefaces.context.RequestContext;
import org.primefaces.event.TabChangeEvent;

import com.fp.dto.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.pgeneral.gene.CantonController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.CityController;
import com.fp.frontend.controller.pgeneral.gene.ParroquiaController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;

@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class VerificarMaterialDecomisadoController extends AbstractController<AbstractDataTransport> {

    /**
     * C&oacute;digo de decomiso
     */
    private String cDecomiso;

    /**
     * Manejador de decomiso armas controller
     */
    @ManagedProperty(value = "#{decomisoArmaController}")
    private DecomisoArmaController decomisoArmaController;

    /**
     * Variable que incluye datos de la cabecera de decomiso
     */
    private TarmDecomiso decomiso;
    /**
     * Variable que incluye datos del detalle del decomiso
     */
    private TarmDecomisoArma decomisoArmaObj;
    /**
     * Provincia
     */
    private String provincia;
    /**
     * Cant&oacute;n
     */
    private String canton;
    /**
     * Ciudad
     */
    private String ciudad;
    /**
     * Parroquia
     */
    private String parroquia;

    /**
     * Variable usada para activar el bot&oacute;n de generar reporte
     */
    private Boolean isEnableImprimir;
    /**
     * Cat&acute;logo Grado
     */
    private TgeneCatalogDetail gradoCatalogDatail;
    /**
     * Cat&acute;logo Unidad
     */
    private TgeneCatalogDetail unidadCatalogDatail;

    private Boolean btnFlujo;
    //private List<TarmDecomisoArma> armasDecomisadasLst = new ArrayList<TarmDecomisoArma>();

    public VerificarMaterialDecomisadoController() throws Exception {
        super(AbstractDataTransport.class);
        // TODO Auto-generated constructor stub
    }

    @PostConstruct
    private void postconstruct() {
        // Inicializa autoconsulta
        startQuery();
        //  cDecomiso="357";
        if (cDecomiso != null) {
            this.init();
            this.query();
        } else {
            decomisoArmaController.setLrecord(new ArrayList<TarmDecomisoArma>());
        }
    }

    public void startQuery() {
        try {
            this.pasteBpmScreenParameters();
            cDecomiso = super.getMfilters().get("cdecomiso");
            super.getMfilters().clear();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            decomiso = DecomisoController.findByCodigo(cDecomiso);
            if (decomiso != null) {
                provincia = ProvinceController.getDescProvByCodigo(decomiso.getCountrycode(), decomiso.getProvincecode());
                canton = CantonController.getDescCantonByCodigo(decomiso.getCountrycode(), decomiso.getProvincecode(), decomiso.getCantoncode());
                ciudad = CityController.getDescCiudadByCodigo(decomiso.getCountrycode(), decomiso.getProvincecode(), decomiso.getCantoncode(), decomiso.getCitycode());
                parroquia = ParroquiaController.getDescParroquiaByCodigo(decomiso.getCountrycode(), decomiso.getProvincecode(), decomiso.getCantoncode(), decomiso.getParroquiacode());
                gradoCatalogDatail = CatalogDetailController.findxCodigoCodcatalogo(decomiso.getGradofuncionario(), decomiso.getGradofuncionariocode());
                TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(decomiso.getCcentrocontrol());
                unidadCatalogDatail = CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo());
                decomisoArmaController.addFilter("cdecomiso", cDecomiso);
                decomisoArmaController.query();
                isEnableImprimir = Boolean.FALSE;
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_numReciboNoRegistrado"));
            }
            btnFlujo = Boolean.FALSE;
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void query() {
        try {
            this.decomisoArmaController.query();
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void next() {
        try {
            if (cDecomiso != null) {
                this.decomisoArmaController.next();
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void previous() {
        try {
            if (cDecomiso != null) {
                this.decomisoArmaController.previous();
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Crea una instancia de TgeneTransactionProcess y marca el registro como
     * nuevo.
     *
     * @throws Exception
     */
    @Override
    public void create() throws Exception {
        super.create();
    }

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

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

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

    @Override
    public void save() {
        try {
            if (decomisoArmaObj == null || decomisoArmaObj.getEnbodega() == null || decomisoArmaObj.getEnbodega().compareTo("Y") != 0) {
                MessageHelper.setMessageWarn(MsgControlArmas.getProperty("msg_proceso"));
                return;
            }
            Request request = this.callerhelper.getRequest();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            DtoSave dtosaveDA = decomisoArmaController.getDtoSave();

            if (dtosaveDA.pendingProcess()) {
                dtosaveDA.setReturnpk(true);
                msave.put(this.decomisoArmaController.getBeanalias(), dtosaveDA);
            }

            request.setSaveTables(msave);
            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.decomisoArmaController.postCommit(resp);
                isEnableImprimir = Boolean.TRUE;
                btnFlujo = Boolean.TRUE;
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para finalizar la tarea del flujo
     */
    public void completarTarea() {

        try {
            Request request = callerhelper.getRequest();
            // limpiar request para finalizar la tarea.
            super.cleanRequest(request);
            request.modifiedData().put("cdecomiso", cDecomiso);
            request.modifiedData().put("TID", tid);
            request.modifiedData().put("BPMStatus", bpmDataStatus == null ? "A" : bpmDataStatus); // A,D,R
            request.modifiedData().put("BPMObs", bpmDataComment == null ? "OK" : bpmDataComment);

            Response resp = callerhelper.executeSave(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                MessageHelper.setMessageInfo(resp);
                btnFlujo = Boolean.FALSE;
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

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

    public DecomisoArmaController getDecomisoArmaController() {
        return decomisoArmaController;
    }

    public void setDecomisoArmaController(
            DecomisoArmaController decomisoArmaController) {
        this.decomisoArmaController = decomisoArmaController;
    }

    public TarmDecomiso getDecomiso() {
        return decomiso;
    }

    public void setDecomiso(TarmDecomiso decomiso) {
        this.decomiso = decomiso;
    }

    public String getProvincia() {
        return provincia;
    }

    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }

    public String getCanton() {
        return canton;
    }

    public void setCanton(String canton) {
        this.canton = canton;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }

    public String getParroquia() {
        return parroquia;
    }

    public void setParroquia(String parroquia) {
        this.parroquia = parroquia;
    }

    public TgeneCatalogDetail getGradoCatalogDatail() {
        return gradoCatalogDatail;
    }

    public void setGradoCatalogDatail(TgeneCatalogDetail gradoCatalogDatail) {
        this.gradoCatalogDatail = gradoCatalogDatail;
    }

    public TgeneCatalogDetail getUnidadCatalogDatail() {
        return unidadCatalogDatail;
    }

    public void setUnidadCatalogDatail(TgeneCatalogDetail unidadCatalogDatail) {
        this.unidadCatalogDatail = unidadCatalogDatail;
    }

    public TarmDecomisoArma getDecomisoArmaObj() {
        return decomisoArmaObj;
    }

    public void setDecomisoArmaObj(TarmDecomisoArma decomisoArmaObj) {
        this.decomisoArmaObj = decomisoArmaObj;
    }

    public Boolean getIsEnableImprimir() {
        return isEnableImprimir;
    }

    public void setIsEnableImprimir(Boolean isEnableImprimir) {
        this.isEnableImprimir = isEnableImprimir;
    }

    public void seleccionarArma(AjaxBehaviorEvent event) {
        try {
            SelectBooleanCheckbox booleanCheckbox = (SelectBooleanCheckbox) event.getComponent();
            decomisoArmaObj = (TarmDecomisoArma) booleanCheckbox.getAttributes().get("armaDecomisadaObj");
            boolean checked = (Boolean) booleanCheckbox.getValue();
            if (checked) {
                decomisoArmaObj.setEnbodega("Y");
            } else {
                decomisoArmaObj.setEnbodega(null);
            }
            decomisoArmaController.update(decomisoArmaObj);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Boolean getBtnFlujo() {
        return btnFlujo;
    }

    public void setBtnFlujo(Boolean btnFlujo) {
        this.btnFlujo = btnFlujo;
    }

}
