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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
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.context.FacesContext;

import org.eclipse.jdt.core.dom.ThisExpression;

import com.fp.dto.AbstractDataTransport;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.TarmCentroControlJurController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pcustomer.lov.PersonLovController;
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.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * @author DLO Clase Controladora la cual genera el reporte de tr&aacute;mite
 * por centro de control
 */
@ManagedBean
@ViewScoped
public class ReporteTramiteCentroController extends AbstractController<AbstractDataTransport> {

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

    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;

    @ManagedProperty(value = "#{personDetailController}")
    private PersonDetailController personDetailController;

    @ManagedProperty(value = "#{centroControlController}")
    private CentroControlArmasController centroControlController;

    private TcustPersonDetail customerperson;
    private TsafeUserDetail userDetail;
    private TcustPersonDetail responsableCentroControl = null;
    private TsafeUserDetail tsafeUserDetailUsuario = null;
    private TarmCentroControl centroControl = new TarmCentroControl();
    private List<TgeneCatalogDetail> lcentros = null;
    private List<TgeneCatalogDetail> lestados = null;
    private String institucionCentroControl = "";
    private Date fechainicial;
    private Date fechafinal;
    private String filtro = "";
    private String filtro2 = "";
    private String idCentroControl;
    private String estado;
    private Date fec_actual;
    private String estadoDoc;

    public String getInstitucionCentroControl() {
        return institucionCentroControl;
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        // Inicializa autoconsulta
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {

            this.lrecord = new ArrayList<>();
            this.beanalias = "REPORTE";
            lcentros = CatalogDetailController.find("NOMBREINSTITUCION");
            this.lestados = CatalogDetailController.find("ESTADODOCUMENTO");
            this.responsableCentroControl = new TcustPersonDetail();
            this.tsafeUserDetailUsuario = new TsafeUserDetail();
            //this.obtenerResponsableCentroControl();
            this.idCentroControl = "";
            this.estadoDoc = "";

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

    /**
     * Obtiene el centro de control segun usurio logeado.
     *
     * @throws Exception
     *
     */
    private String obtenerCentroControl() throws Exception {

        this.tsafeUserDetailUsuario = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
        PersonAddressController personAddressController = new PersonAddressController();
        TcustPersonAddress tcustPersonAddres = personAddressController.findPrincipal(tsafeUserDetailUsuario.getPk().getPersoncode().toString());
        if (tcustPersonAddres != null && tcustPersonAddres.getProvincecode() != null) {
            TarmCentroControlJur centroControlJur = TarmCentroControlJurController.findxProvincia(tcustPersonAddres.getProvincecode());
            centroControl = CentroControlArmasController.findPorCodigo(centroControlJur.getCcentrocontrol());
            return CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription();
        } else {
            return "";
        }
    }

    /**
     * Obtiene el responsable del Centro de Control
     */
    public void obtenerResponsableCentroControl() {
        Integer responsable = this.centroControl.getPersoncode();
        this.responsableCentroControl = PersonDetailController.find(responsable.toString());

    }

    @Override
    protected void querydatabase() {

    }

    /**
     * Graba los registros en la base de datos
     */
    @Override
    public void save() {

    }

    /**
     * Obtiene el reporte de Ficha de Armas
     */
    public void reporteTramitesCentro() {
        try {
            if (this.fechainicial.getTime() > this.fechafinal.getTime()) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_fechafinal"));
                return;
            }
            String gradoUsuario = "";
            String path = "armas/reports/reporteTremiteXCentro";
            String filename = MsgControlArmas.getProperty("lbl_tramitesXcentro");
            //String filename="reporte";

            // Datos del centro de control del usuario logueado
            institucionCentroControl = obtenerCentroControl();

            //Fija parametros del report.
            HashMap<String, Object> parameters = new HashMap<>();
            parameters.put("pathLogoIzquierda", "repo:/maia/1/image/comandoconjunto");
            parameters.put("pathLogoDerecha", "repo:/maia/1/image/selloarmas");
            parameters.put("centroControl", institucionCentroControl);

            //Centro de control
            parameters.put("centroControl", this.obtenerCentroControl());

            //Fecha actual
            this.fec_actual = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
            parameters.put("fecActual", sdf.format(this.fec_actual));

            //usuario
            customerperson = PersonDetailController.find(this.tsafeUserDetailUsuario.getPk().getPersoncode().toString());
            parameters.put("usuario", customerperson.getName());

            //fechas inicial y final que vienen desde el controlador
            SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            parameters.put("fechainicial", df.format(this.fechainicial));
            parameters.put("fechafinal", df.format(this.fechafinal));

            TarmCentroControl centro = null;
            if (!this.idCentroControl.toString().equals("TODOS")) {
                centro = CentroControlArmasController.findPorCentroControl(this.idCentroControl.toString());
            }
//            if(centro == null){
//            	MessageHelper.setMessageInfo("EL CENTRO DE CONTROL DE ARMAS SELECCIONADO NO TIENE DATOS A MOSTRAR");
//            	return;
//            }

            if (centro != null && centro.getPk() != null && this.idCentroControl.toString() != "TODOS") {
                this.filtro = " and h.ccentrocontrol = '" + centro.getPk() + "' ";
                parameters.put("filtro", this.filtro);
            } else {
                parameters.put("filtro", "");
            }

            if (this.estadoDoc.equals("APR") && this.estadoDoc != null) {
                this.filtro2 = " and h.estado = '" + this.estadoDoc + "' ";
                parameters.put("filtro2", this.filtro2);
            } else if (this.estadoDoc.equals("CAN") && this.estadoDoc != null) {
                this.filtro2 = " and h.estado = '" + this.estadoDoc + "' ";
                parameters.put("filtro2", this.filtro2);
            } else if (this.estadoDoc.equals("SUS") && this.estadoDoc != null) {
                this.filtro2 = " and h.estado = '" + this.estadoDoc + "' ";
                parameters.put("filtro2", this.filtro2);
            } else if (this.estadoDoc.equals("FIN") && this.estadoDoc != null) {
                this.filtro2 = " and h.estado = '" + this.estadoDoc + "' ";
                parameters.put("filtro2", this.filtro2);
            } else {
                parameters.put("filtro2", "");
            }

            String format = "xlsx";

            try {

                this.reportController.executeXls(path, parameters, format, filename, this.getLoginController());
            } catch (Exception ex) {
                MessageHelper.setMessageError(ex);
            }

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

    public ReportController getReportController() {
        return reportController;
    }

    public void setReportController(ReportController reportController) {
        this.reportController = reportController;
    }

    public TcustPersonDetail getCustomerperson() {
        return customerperson;
    }

    public void setCustomerperson(TcustPersonDetail customerperson) {
        this.customerperson = customerperson;
    }

    public TsafeUserDetail getUserDetail() {
        return userDetail;
    }

    public void setUserDetail(TsafeUserDetail userDetail) {
        this.userDetail = userDetail;
    }

    public TcustPersonDetail getResponsableCentroControl() {
        return responsableCentroControl;
    }

    public void setResponsableCentroControl(
            TcustPersonDetail responsableCentroControl) {
        this.responsableCentroControl = responsableCentroControl;
    }

    public TsafeUserDetail getTsafeUserDetailUsuario() {
        return tsafeUserDetailUsuario;
    }

    public void setTsafeUserDetailUsuario(TsafeUserDetail tsafeUserDetailUsuario) {
        this.tsafeUserDetailUsuario = tsafeUserDetailUsuario;
    }

    public TarmCentroControl getCentroControl() {
        return centroControl;
    }

    public void setCentroControl(TarmCentroControl centroControl) {
        this.centroControl = centroControl;
    }

    public Date getFechainicial() {
        return fechainicial;
    }

    public void setFechainicial(Date fechainicial) {
        this.fechainicial = fechainicial;
    }

    public Date getFechafinal() {
        return fechafinal;
    }

    public void setFechafinal(Date fechafinal) {
        this.fechafinal = fechafinal;
    }

    public String getFiltro() {
        return filtro;
    }

    public void setFiltro(String filtro) {
        this.filtro = filtro;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public Date getFec_actual() {
        return fec_actual;
    }

    public void setFec_actual(Date fec_actual) {
        this.fec_actual = fec_actual;
    }

    public void setInstitucionCentroControl(String institucionCentroControl) {
        this.institucionCentroControl = institucionCentroControl;
    }

    public String getIdCentroControl() {
        return idCentroControl;
    }

    public void setIdCentroControl(String idCentroControl) {
        this.idCentroControl = idCentroControl;
    }

    public List<TgeneCatalogDetail> getLcentros() {
        return lcentros;
    }

    public void setLcentros(List<TgeneCatalogDetail> lcentros) {
        this.lcentros = lcentros;
    }

    public PersonDetailController getPersonDetailController() {
        return personDetailController;
    }

    public void setPersonDetailController(
            PersonDetailController personDetailController) {
        this.personDetailController = personDetailController;
    }

    public CentroControlArmasController getCentroControlController() {
        return centroControlController;
    }

    public void setCentroControlController(
            CentroControlArmasController centroControlController) {
        this.centroControlController = centroControlController;
    }

    public List<TgeneCatalogDetail> getLestados() {
        return lestados;
    }

    public void setLestados(List<TgeneCatalogDetail> lestados) {
        this.lestados = lestados;
    }

    public String getEstadoDoc() {
        return estadoDoc;
    }

    public void setEstadoDoc(String estadoDoc) {
        this.estadoDoc = estadoDoc;
    }

    public StringBuilder armarFormatoFechaSinHora(Calendar fechaCldr) {
        StringBuilder fechaStr = new StringBuilder();
        fechaStr = fechaStr.append((fechaCldr.get(Calendar.DAY_OF_MONTH)) <= 9 ? "0" + (fechaCldr.get(Calendar.DAY_OF_MONTH)) : (fechaCldr.get(Calendar.DAY_OF_MONTH)));
        fechaStr = fechaStr.append("-").append((fechaCldr.get(Calendar.MONTH) + 1) <= 9 ? "0" + (fechaCldr.get(Calendar.MONTH) + 1) : (fechaCldr.get(Calendar.MONTH) + 1));
        fechaStr = fechaStr.append("-").append(fechaCldr.get(Calendar.YEAR));
        return fechaStr;
    }

}
