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

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
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 javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.component.selectbooleancheckbox.SelectBooleanCheckbox;
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.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.alfresco.AlfrescoController;
import com.fp.frontend.controller.armas.funcionalidad.RegistroArmController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
import com.fp.frontend.controller.armas.parametros.TarmCentroControlJurController;
import com.fp.frontend.controller.armas.parametros.TiposArmasExplosivosController;
import com.fp.frontend.controller.pcustomer.PersonAddressController;
import com.fp.frontend.controller.pcustomer.PersonDetailController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.ParametersController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmCabRepDestruirArmas;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmDetRepDestruirArmas;
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;

/**
 * Clase controladora de reporte de liquidacion economica
 *
 * @author Christian Pazmino.
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ReporteInspeccionesRealizadasController extends AbstractController<TarmDecomisoArma> {

    /**
     * Fecha a partir de la cual se sacan datos para el reporte
	 *
     */
    private Date fechaInicio;
    /**
     * Fecha a partir de la cual se sacan datos para el reporte
	 *
     */
    private Date fechaFin;
    /**
     * Formato de reporte que se va a generar
	 *
     */
    private String format = "pdf";
    /**
     * Usuario actual logueado en el sistema
	 *
     */
    private TsafeUserDetail userDetail;
    /**
     * Nombre del reporte generado en el Alfresco
	 *
     */
    private String nombreReporte;
    /**
     * Id del centro de control seleccionado por el usuario
	 *
     */
    private String idCentroControl;
    /**
     * Lista de centros de control de armas
     */
    private List<TarmCentroControl> centroControlList;

//    private List<TgeneCatalogDetail> lTipoReporte=new ArrayList<TgeneCatalogDetail>();
    private TsafeUserDetail tsafeUserDetailUsuario = null;

    private TarmCentroControl centroControl = new TarmCentroControl();

    private TcustPersonDetail responsableCentroControl = null;

    /**
     * Clase controladora de reportes
     */
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;

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

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

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            userDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            recperpage = 10000; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<TarmDecomisoArma>();
            beanalias = "RPRTELIQUIDACIONECONOMICA";
            centroControlList = CentroControlArmasController.findEstado("Y");
            this.tsafeUserDetailUsuario = new TsafeUserDetail();
            this.responsableCentroControl = new TcustPersonDetail();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

//    /**
//     * Crea una instancia y marca el registro como nuevo.
//     * 
//     * @throws Exception
//     */
//    @Override
//    public void create() throws Exception {
//        super.create();
//    }
    /**
     * Seleccionado todos los registros de la tabla
     */
    public void seleccionarTodos(AjaxBehaviorEvent event) {
        try {
            Boolean valorColocar = Boolean.FALSE;
            if (Boolean.valueOf(event.getComponent().getAttributes().get("value") != null ? event.getComponent().getAttributes().get("value").toString() : "false")) {
                valorColocar = Boolean.TRUE;
            }
            for (TarmDecomisoArma decomisoArmaObj : lrecord) {
                decomisoArmaObj.getModifiedData().put("isSelect", valorColocar);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {

    }

    /**
     * Metodo para reconsultar en base a una nueva fecha de corte seleccionada
     */
    public void cambioFechaDeCorte(SelectEvent event) {
        querydatabase();
    }

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

    /**
     * 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) {
            return null;
        }
        TarmCentroControlJur centroControlJur = TarmCentroControlJurController.findxProvincia(tcustPersonAddres.getProvincecode());
        centroControl = CentroControlArmasController.findPorCodigo(centroControlJur.getCcentrocontrol());
        return CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription();
    }

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

    }

    /**
     * Genera un reporte de armas a destruir
     *
     */
    public void generateReport2() {
        String filtro = "";

        if (this.fechaInicio.getTime() > this.fechaFin.getTime()) {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaInicioMayorAFechaFin"));
            return;
        }
        if (this.fechaInicio.getTime() > new Date().getTime()) {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaInicioMayorAFechaActual"));
            return;
        }
        if (this.fechaFin.getTime() > new Date().getTime()) {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaFinMayorAFechaActual"));
            return;
        }
        try {
            String path = "armas/reports/inspeccionesRealizadas";
            String filename = "inspeccionesRealizadas";
            HashMap<String, Object> parameters = new HashMap<>();
            parameters.put("pathLogoIzquierda", "repo:/maia/1/image/comandoconjunto");
            parameters.put("pathLogoDerecha", "repo:/maia/1/image/selloarmas");

            //usuario
            TsafeUserDetail tsafeUserDetailUsuario = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            TcustPersonDetail person = PersonDetailController.find(tsafeUserDetailUsuario.getPk().getPersoncode().toString());
            parameters.put("usuario", person.getName());
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            parameters.put("fechaInicio", sdf.format(this.fechaInicio));
            parameters.put("fechaFin", sdf.format(this.fechaFin));
            parameters.put("fechaReporte", sdf.format(new Date()));

            if (this.idCentroControl.equals("TODOS")) {
                parameters.put("filtro", "");
            } else {
                filtro = " and c.ccentrocontrol = '" + this.idCentroControl + "' ";
                parameters.put("filtro", filtro);
            }
            this.reportController.executeXls(path, parameters, format, filename, this.getLoginController());
        } catch (Exception e) {
            // TODO: handle exception
        }

    }

    /**
     * Genera un reporte de armas a destruir
     *
     */
    public void generateReport() {
        Calendar fechaActualCldr = Calendar.getInstance();
        Calendar fechaInicioCldr = Calendar.getInstance();
        Calendar fechaFinCldr = Calendar.getInstance();
        fechaInicioCldr.setTime(fechaInicio);
        fechaFinCldr.setTime(fechaFin);
        if (fechaActualCldr.compareTo(fechaInicioCldr) >= 0) {
            if (fechaActualCldr.compareTo(fechaFinCldr) >= 0) {
                if (fechaFinCldr.compareTo(fechaInicioCldr) >= 0) {
                    String filename = "inspeccionesRealizadas";
                    // 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");

                    try {
                        //Usuario logueado en la aplicacion
                        String nombreUsuario;
                        if (userDetail.getPk().getPersoncode() != null) {
                            nombreUsuario = PersonDetailController.find(userDetail.getPk().getPersoncode().toString()).getName();
                        } else {
                            nombreUsuario = "";
                        }
                        parameters.put("usuario", nombreUsuario);
                        parameters.put("fechaInicio", armarFormatoFechaSinHora(fechaInicioCldr));
                        fechaFinCldr.add(Calendar.DAY_OF_MONTH, 1);
                        parameters.put("fechaFin", armarFormatoFechaSinHora(fechaFinCldr));
                        parameters.put("fechaReporte", armarFormatoFechaConHora(fechaActualCldr));

                        String path;
                        if (!idCentroControl.equalsIgnoreCase("TODOS")) {
                            path = "armas/reports/inspeccionesRealizadas";
                            parameters.put("idCentroControl", idCentroControl);
                            // Datos del CENTRO DE CONTROL
                            TarmCentroControl centroControlObj = CentroControlArmasController.findPorCodigo(idCentroControl);
                            String nombreCentroControl = CatalogDetailController.findxCodigoCodcatalogo(centroControlObj.getNombreinstitucion(), centroControlObj.getNombreinstitucioncodigo()).getDescription();
                            parameters.put("nombreCentroControl", nombreCentroControl);
                            // Datos del jefe del centro
                            if (centroControlObj.getPersoncode() != null) {
                                TcustPersonDetail supervisorMilitarObj = PersonDetailController.find(centroControlObj.getPersoncode().toString());
                                String gradoSupMilitar = supervisorMilitarObj.getMilitarygrade() == null ? "" : supervisorMilitarObj.getMilitarygrade() + " - ";
                                parameters.put("nombreJefCentro", gradoSupMilitar + supervisorMilitarObj.getName() == null ? "" : supervisorMilitarObj.getName());
                                parameters.put("personCodeJefCentro", supervisorMilitarObj.getPk().getPersoncode() == null ? "1001" : supervisorMilitarObj.getPk().getPersoncode());

                            }
                        } else {
                            path = "armas/reports/inspeccionesRealizadas";
                            filename = "inspeccionesRealizadasCCA";
                            parameters.put("idCentroControl", null);
                            parameters.put("nombreCentroControl", "TODOS");
                            parameters.put("nombreJefCentro", "Juan Todos");
                            parameters.put("personCodeJefCentro", 1001);
                        }
                        this.reportController.executeXls(path, parameters, format, filename, this.getLoginController());

                    } catch (Exception ex) {
                        MessageHelper.setMessageError(ex);
                    }
                } else {
                    MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaInicioMayorAFechaFin"));
                }
            } else {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaFinMayorAFechaActual"));
            }
        } else {
            MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_liqeco_fechaInicioMayorAFechaActual"));
        }

    }

//    parameters.put("fechaCorte", fechaCorteSB.toString());	        		
//	parameters.put("codArmasDecomisadasLst", actualizarArmasSeleccionadas());
    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;
    }

    public StringBuilder armarFormatoFechaConHora(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));
        fechaStr = fechaStr.append(" ").append(fechaCldr.get(Calendar.HOUR_OF_DAY));
        fechaStr = fechaStr.append(":").append((fechaCldr.get(Calendar.MINUTE)) <= 9 ? "0" + (fechaCldr.get(Calendar.MINUTE)) : (fechaCldr.get(Calendar.MINUTE)));
        return fechaStr;
    }

    /**
     * M&eacute;todo para el inicio de flujo. Guardar el reporte creado para su
     * posterior aprobacion en otras instancias del flujo
     */
    @Override
    public void save() {

    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public TsafeUserDetail getUserDetail() {
        return userDetail;
    }

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

    public String getNombreReporte() {
        return nombreReporte;
    }

    public void setNombreReporte(String nombreReporte) {
        this.nombreReporte = nombreReporte;
    }

    public String getIdCentroControl() {
        return idCentroControl;
    }

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

    public List<TarmCentroControl> getCentroControlList() {
        return centroControlList;
    }

    public void setCentroControlList(List<TarmCentroControl> centroControlList) {
        this.centroControlList = centroControlList;
    }

    public ReportController getReportController() {
        return reportController;
    }

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

}
