/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.fp.frontend.controller.armas.solicitud;

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.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.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.persistence.commondb.helper.FormatDates;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.parmas.soli.TarmDocumentoHabilitante;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pgeneral.gene.TgeneProvince;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;
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.openide.util.Exceptions;
import org.openide.util.Utilities;

/**
 * Controlador para reporte de permisos proximos a vencerce
 *
 */
@ManagedBean
@ViewScoped
public class ReportePermisosVencerceController extends AbstractController<TarmDocumentoHabilitante> {
    private static final long serialVersionUID = 1L;
    
    
    private Integer numeroDiasCaducarseSumar = 5;
    private Date fechavencimiento;

    private String jurisdiccion;
    
    private List<TgeneProvince> ljurisdicciones;
    private boolean administrador = Boolean.FALSE;
    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;
  
    
    
    @PostConstruct
    public void postConstruct(){
    
        init();
        super.startQuery();
        
    }
    
    private void init() {
        this.beanalias = "PERMISOSVENCERSE";
        this.recperpage = 15;
        this.lrecord = new ArrayList<>();
        this.ljurisdicciones =ProvinceController.find("EC");
        TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
        PersonAddressController direccionController = null;
        fechavencimiento = sumarDiasFecha(new Date(), numeroDiasCaducarseSumar);
        try {
            direccionController = new PersonAddressController();
            TcustPersonAddress tcustPersonAddres = direccionController.findPrincipal(tsafeUserDetail.getPk().getPersoncode().toString());

            if(!super.getLoginController().getProfilecode().equals("26")){
                jurisdiccion = tcustPersonAddres.getProvincecode();
                administrador = Boolean.FALSE;
            }else{
                administrador = Boolean.TRUE;
            }
        } catch (Exception ex) {
            Exceptions.printStackTrace(ex);
        }

        
        
        
    }
    /**
     * SUMAR DIAS A UNA FECHA
     */
    public Date sumarDiasFecha(Date fecha, int dias){	
        Calendar calendar = Calendar.getInstance();

        calendar.setTime(fecha); // Configuramos la fecha que se recibe
        calendar.add(Calendar.DAY_OF_YEAR, dias);  // numero de días a añadir, o restar en caso de días<0

        return calendar.getTime(); // Devuelve el objeto Date con los nuevos días añadidos
	
    }
    
    public ReportePermisosVencerceController() throws Exception{
        super(TarmDocumentoHabilitante.class);
    }
    
    private DtoQuery getDtoQuery () throws Exception{
    
        DtoQuery dto = super.getDtoQuery(true);
            SubQuery subqueryCategoriaCodigo = new SubQuery("TgeneCatalogDetail", "description", "description", "i.pk.catalog = (select a.tipotramite from TarmTramite a where a.pk=t.ctramite)"
                    + "and i.pk.catalogcode=(select a.tipotramitecodigo from TarmTramite a where a.pk=t.ctramite)");
            dto.addSubQuery(subqueryCategoriaCodigo);
            SubQuery subquerytipoAutorizacion = new SubQuery("TgeneCatalogDetail", "pk.catalog", "autorizacion", "i.pk.catalog = (select a.tipoautorizacion from TarmTramite a where a.pk=t.ctramite)"
                    + "and i.pk.catalogcode=(select a.tipoautorizacioncodigo from TarmTramite a where a.pk=t.ctramite)");
            dto.addSubQuery(subquerytipoAutorizacion);
            SubQuery subqueryipoAutorizacion = new SubQuery("TgeneCatalogDetail", "description", "descriptionTipoAut", "i.pk.catalog = (select a.tipoautorizacion from TarmTramite a where a.pk=t.ctramite)"
                    + "and i.pk.catalogcode=(select a.tipoautorizacioncodigo from TarmTramite a where a.pk=t.ctramite)");
            dto.addSubQuery(subqueryipoAutorizacion);
            
            SubQuery subqueryTipocodigo = new SubQuery("TgeneCatalogDetail", "description", "descriptiontram", "i.pk.catalog = (select a.categoria from TarmTramite a where a.pk=t.ctramite)"
                    + "and i.pk.catalogcode=(select a.categoriacodigo from TarmTramite a where a.pk=t.ctramite)");
            dto.addSubQuery(subqueryTipocodigo);
            SubQuery subqueryUsocodigo = new SubQuery("TgeneCatalogDetail", "description", "descriptionact", "i.pk.catalog = (select a.usoactividad from TarmTramite a where a.pk=t.ctramite)"
                    + "and i.pk.catalogcode=(select a.usoactividadcodigo from TarmTramite a where a.pk=t.ctramite)");
            
            dto.addSubQuery(subqueryUsocodigo);
            
            SubQuery subQueryIdentificacionPersona = new SubQuery("TcustPersonDetail", "identification", "identificacion", "i.pk.personcode = t.personcode and i.pk.dateto=(select max(dt.pk.dateto) from TcustPersonDetail dt where dt.pk.personcode=t.personcode)");
            
            dto.addSubQuery(subQueryIdentificacionPersona);
            SubQuery subQueryNombrePersona = new SubQuery("TcustPersonDetail", "name", "nombre", "i.pk.personcode = t.personcode and i.pk.dateto=(select max(dt.pk.dateto) from TcustPersonDetail dt where dt.pk.personcode=t.personcode)");
            dto.addSubQuery(subQueryNombrePersona);
            SubQuery subQueryCentroControl =  new SubQuery("TgeneCatalogDetail", "description", "nombrecentro", "i.pk.catalog = (select nombreinstitucion from TarmCentroControl tac where tac.pk = t.centrocontrol) and i.pk.catalogcode = (select nombreinstitucioncodigo from TarmCentroControl tac where tac.pk = t.centrocontrol)");
            dto.addSubQuery(subQueryCentroControl);
            /**
            SubQuery subQueryTipoArma = new SubQuery("TarmArmas", "lote", "lote", "i.pk = t.carma");
            
            dto.addSubQuery(subQueryTipoArma);*/
            /**
            SubQuery subqueryEstadoDoc = new SubQuery("TgeneCatalogDetail", "description", "estadodocumento", "i.pk.catalog = t.estado"
                    + " and i.pk.catalogcode= t.estadocode");
            dto.addSubQuery(subqueryEstadoDoc);*/
            return dto;
    }
    
    
    @Override
    protected void querydatabase() {
        try {
            SimpleDateFormat vDate = new SimpleDateFormat("yyyy-MM-dd");

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            Date fechaActual = new Date();
            DtoQuery dto = getDtoQuery();
            if (this.fechavencimiento.before(fechaActual)) {
                MessageHelper.setMessageError("El valor hace referencia al número de dias que queda para que el permiso caduque y debe ser mayor o igual a 0");
            }          
            Filter filter = new Filter();
            String filtro = String.format("t.estado = 'APR' and t.fechaexpiracion is not null AND (t.fechaexpiracion between '%s' and '%s') and t.pathSuspencion is null",vDate.format(fechaActual), vDate.format(fechavencimiento));

            if(jurisdiccion != null && !jurisdiccion.equals("TODOS")){
                TarmCentroControlJur centroControlJurisdiccion = TarmCentroControlJurController.findxProvincia(jurisdiccion);
                if(centroControlJurisdiccion != null){
                    filtro = String.format("%s and t.centrocontrol='%s'", filtro, centroControlJurisdiccion.getCcentrocontrol());
                }
            }
            filter.setSql(filtro);
            dto.addFiltro(filter);

            dto.setOrderby("t.fechaexpiracion");
            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<>();
                MessageHelper.setMessageError(resp);
            } else {
                lrecord = (List<TarmDocumentoHabilitante>) resp.get(beanalias);
                super.postQuery(lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }    
    }
    
    /**
     * Generar Reporte
     */
    public void generarReportePermisosVencerse() {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            String path = "armas/reports/reportePermisosVencidos";
            String filename = String.format("Permisos-caducarse-%s", sdf.format(fechavencimiento));
            TsafeUserDetail tsafeUserDetailUsuario = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");

            //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", obtenerCentroControl());

        
            //Fecha actual
            Date fechaActual = new Date();
            parameters.put("fechaInicio", String.format("%s", sdf.format(fechaActual)));
            parameters.put("fechaFin", String.format("%s", sdf.format(fechavencimiento)));
            String filtro = "";
            TarmCentroControlJur jurCentroControl = TarmCentroControlJurController.findxProvincia(jurisdiccion);
            if(!jurisdiccion.trim().endsWith("TODOS") && jurCentroControl !=null){
                filtro = String.format("and t.ccentrocontrol='%s'", jurCentroControl.getCcentrocontrol());
            }
            parameters.put("filtro", filtro);
            parameters.put("idCentroControl", jurisdiccion.trim().equals("TODOS") ? null : TarmCentroControlJurController.findxProvincia(jurisdiccion).getCcentrocontrol());
            parameters.put("usuario", tsafeUserDetailUsuario.getPk().getUsercode());

            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);
        }
    }
    /**
     * Obtiene el centro de control segun usurio logeado.
     *
     * @throws Exception
     *
     */
    private String obtenerCentroControl() throws Exception {

        TsafeUserDetail 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());
            TarmCentroControl centroControl = CentroControlArmasController.findPorCodigo(centroControlJur.getCcentrocontrol());
            return CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo()).getDescription();
        } else {
            return "";
        }
    }
    
    /**
     * Numero de dias que se sumara a fecha por defecto
     */
    public Integer getNumeroDiasCaducarseSumar() {    
        return numeroDiasCaducarseSumar;
    }

    public void setNumeroDiasCaducarseSumar(Integer numeroDiasCaducarseSumar) {
        this.numeroDiasCaducarseSumar = numeroDiasCaducarseSumar;
    }
    /**
     * FECHA VENCIMIENTO
     */
    public Date getFechavencimiento() {   
        return fechavencimiento;
    }

    public void setFechavencimiento(Date fechavencimiento) {
        this.fechavencimiento = fechavencimiento;
    }
    

    /**
     * Jurisdiccion seleccionada como filtro
     */
    public String getJurisdiccion() {
        return jurisdiccion;
    }

    public void setJurisdiccion(String jurisdiccion) {
        this.jurisdiccion = jurisdiccion;
    }
    
    /**
     * Lista de provincias (Jurisdicciones)
     */
    public List<TgeneProvince> getLjurisdicciones() {
        return ljurisdicciones;
    }

    public void setLjurisdicciones(List<TgeneProvince> ljurisdicciones) {
        this.ljurisdicciones = ljurisdicciones;
    }

    public boolean isAdministrador() {
        return administrador;
    }

    public void setAdministrador(boolean administrador) {
        this.administrador = administrador;
    }

    public ReportController getReportController() {
        return reportController;
    }

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