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

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.primefaces.context.RequestContext;
import org.apache.taglibs.standard.tag.common.fmt.BundleSupport;

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.ReportController;
import com.fp.frontend.controller.armas.parametros.CentroControlArmasController;
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.helper.MessageHelper;
import com.fp.frontend.utility.MsgControlArmas;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmTramite;
import com.fp.persistence.parmas.soli.TarmOrdenTrabajo;
import com.fp.persistence.parmas.soli.TarmOrdenTrabajoCustodios;
import com.fp.persistence.parmas.soli.TarmSolicitud;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

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

    private static final long serialVersionUID = 1L;

    private Date fechaHoy;
    private Date inicio;
    private Date fin;
    private java.sql.Date fechaInicio;
    private java.sql.Date fechaFin;

    private TarmSolicitud solicitud = new TarmSolicitud();
    private TarmSolicitudTramite solicitudTramite = new TarmSolicitudTramite();
    private TarmTramite tramite = new TarmTramite();
    private String usoActividad;
    private Long numeroOrden;

    private String documentoReferencia;
    private String empresa;
    private String lugarDireccion;
    private String ruta;
    private String tiempoEstimado;
    private String observaciones;

    private Boolean aceptarHabilitado = true;

    TcustPersonDetail detallesPersona = new TcustPersonDetail();

    //Grados
    List<TgeneCatalogDetail> lGrados = new ArrayList<TgeneCatalogDetail>();

    TcustPersonDetail usuario;
    TcustPersonDetail jefeCentroControl;
    TarmCentroControl centroControl;
    String nombreInstitucion = "";
    String gradoFuncionario = "";
    private String csolicitud;
    private Boolean btnEnviar;

    @ManagedProperty(value = "#{ordenTrabajoController}")
    private OrdenTrabajoController ordenTrabajoController;

    @ManagedProperty(value = "#{custodiosController}")
    private CustodiosController custodiosController;

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

    public GenerarOrdenTrabajoCustodiosController() throws Exception {
        super(AbstractDataTransport.class);
    }

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

    public void startQuery() {
        try {
            this.pasteBpmScreenParameters();
            csolicitud = super.getMfilters().get("csolicitud");
            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 {
            fechaHoy = Calendar.getInstance().getTime();

            this.ordenTrabajoController.create();
            this.custodiosController.create();
            this.lrecord = new ArrayList<>();
            this.beanalias = "GENERARORDENCUSTODIOSCONTROLLER";
            //ordenTrabajoController.setRecord(new TarmOrdenTrabajo());

            //Obteniendo los datos del usuario logueado
            TsafeUserDetail tsafeUserDetail = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");
            usuario = PersonDetailController.find(tsafeUserDetail.getPk().getPersoncode().toString());
            btnEnviar = Boolean.FALSE;

            querydatabase();

        } catch (Exception 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();
    }

    @Override
    public void query() throws Exception {
        // TODO Auto-generated method stub
        MessageHelper.setMessageError("msg_notQuery");
        super.query();
    }

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

            //Obteniendo la solicitud
            solicitud = ValidacionTramiteLibreTransitoController.findPorSolicitudSimple(csolicitud);
            if (solicitud != null && solicitud.getPk() != null) {

                //Datos de la persona
                detallesPersona = PersonDetailController.find(String.valueOf(solicitud.getPersoncode().toString()));

                this.ordenTrabajoController.getRecord().setCsolicitud(solicitud.getPk());
                this.ordenTrabajoController.getRecord().setFsolicitud(solicitud.getFregistro());

                solicitudTramite = TarmSolicitudTramiteController.findPorCSolicitud(solicitud.getPk());

                if (solicitudTramite != null && solicitudTramite.getPk().getCtramite() != null) {

                    tramite = TarmTramiteController.find(solicitudTramite.getPk().getCtramite().toString());

                    if (tramite != null && tramite.getPk() != null) {
                        this.ordenTrabajoController.getRecord().setCtramite(tramite.getPk());

                        //Uso actividad
                        TgeneCatalogDetail catalogDetailTramite = CatalogDetailController.findxCodigoCodcatalogo(solicitudTramite.getEstadotramite(), solicitudTramite.getEstadotramitecodigo());
                        catalogDetailTramite = CatalogDetailController.findxCodigoCodcatalogo(tramite.getUsoactividad(), tramite.getUsoactividadcodigo());
                        if (catalogDetailTramite != null && tramite.getUsoactividad() != null && tramite.getUsoactividadcodigo() != null) {
                            usoActividad = catalogDetailTramite.getDescription();
                        }

                    }
                }

                //Obteniendo el centro de control
                centroControl = CentroControlArmasController.findPorCodigo(solicitud.getCcentrocontrol());
                if (centroControl != null && centroControl.getNombreinstitucion() != null && !centroControl.getNombreinstitucion().isEmpty()
                        && centroControl.getNombreinstitucioncodigo() != null && !centroControl.getNombreinstitucioncodigo().isEmpty()) {

                    TgeneCatalogDetail catalogoInstitucion = CatalogDetailController.findxCodigoCodcatalogo(centroControl.getNombreinstitucion(), centroControl.getNombreinstitucioncodigo());
                    this.nombreInstitucion = catalogoInstitucion.getDescription();
                }

                //Obteniendo el jefe del centro de control
                this.jefeCentroControl = PersonDetailController.find(this.centroControl.getPersoncode().toString());

                //Obteniendo el grado del jefe del centro de control
                TgeneCatalogDetail grado = CatalogDetailController.findxCodigoCodcatalogo(this.jefeCentroControl.getMilitarygrade(), this.jefeCentroControl.getMilitarygradecode());
                if (grado != null) {
                    gradoFuncionario = grado.getDescription() + " - ";
                }

            }

            //Obteniendo la lista de grados militares
            lGrados = CatalogDetailController.find("GRADOS");

            DtoQuery dto = super.getDtoQuery(true);

            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);
            request.put("querytype", "T");

            Response resp = callerhelper.executeQuery(request);

            //Obteniendo el numero de orden
            this.numeroOrden = Long.parseLong(resp.get("SECUENCIALSOLORDENTRABAJO").toString());
            this.ordenTrabajoController.getRecord().setPk(numeroOrden);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {

                MessageHelper.setMessageError(resp);
            } else {
                super.postQuery(lrecord);

            }

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

    @Override
    public void save() {
        try {
            if (custodiosController.getLrecord().isEmpty()) {
                MessageHelper.setMessageError("LA ORDEN DE TRABAJO NO TIENE CUSTODIOS ASIGNADOS.", null);
            } else {
                //Asignando los campos a la orden de trabajo
                this.ordenTrabajoController.getRecord().setDocumentoreferencia(this.solicitudTramite.getNumerotramite());
                this.ordenTrabajoController.getRecord().setEmpresasolicita(this.detallesPersona.getName());
                this.ordenTrabajoController.getRecord().setDireccioncomision(this.lugarDireccion);
                this.ordenTrabajoController.getRecord().setRuta(this.ruta);
                this.ordenTrabajoController.getRecord().setTiempoestimado(this.tiempoEstimado);

                Calendar c = Calendar.getInstance();
                c.setTime(inicio);
                fechaInicio = new java.sql.Date(c.getTimeInMillis());
                this.ordenTrabajoController.getRecord().setFinicio(this.fechaInicio);

                c = Calendar.getInstance();
                c.setTime(fin);
                fechaFin = new java.sql.Date(c.getTimeInMillis());
                this.ordenTrabajoController.getRecord().setFfinalizacion(this.fechaFin);

                this.ordenTrabajoController.getRecord().setObservaciones(this.observaciones);

                this.ordenTrabajoController.update();
                this.ordenTrabajoController.getLrecord().add(this.ordenTrabajoController.getRecord());
                this.ordenTrabajoController.update(this.ordenTrabajoController.getLrecord().get(0));

                this.custodiosController.setSalva(true);
                for (TarmOrdenTrabajoCustodios custodio : this.custodiosController.getLrecord()) {

                    //Asignando el codigo del grado
                    custodio.setCordentrabajo(this.numeroOrden);
                    this.custodiosController.update(custodio);
                }

                Request request = callerhelper.getRequest();
                HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();

                DtoSave dtosaveOrdenTrabajo = this.ordenTrabajoController.getDtoSave(true);
                dtosaveOrdenTrabajo.setPosition(1);
                msave.put(this.ordenTrabajoController.getBeanalias(), dtosaveOrdenTrabajo);

                DtoSave dtosaveCustodios = this.custodiosController.getDtoSave(true);
                dtosaveCustodios.setPosition(2);
                msave.put(this.custodiosController.getBeanalias(), dtosaveCustodios);

                request.setSaveTables(msave);
                Response resp = callerhelper.executeSave(request);

                if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                    this.aceptarHabilitado = false;
                    this.ordenTrabajoController.postCommit(resp);
                    this.custodiosController.postCommit(resp);
                    MessageHelper.setMessageInfo(resp);
                } else {
                    MessageHelper.setMessageError(resp);
                }
            }

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

    @Override
    public void postCommit(Response response) throws Exception {
        this.ordenTrabajoController.postCommit(response);
        this.custodiosController.postCommit(response);
    }

    public void cancelar() {
        this.ordenTrabajoController.setRecord(new TarmOrdenTrabajo());
        this.custodiosController.getLrecord().clear();
    }

    /**
     */
    @SuppressWarnings("finally")
    public String grado(String grado, String gradoCodigo) {
        String descripcionGrado = "";
        try {
            TgeneCatalogDetail catalogDetailTramite = CatalogDetailController.findxCodigoCodcatalogo(grado, gradoCodigo);
            if (catalogDetailTramite != null && grado != null && gradoCodigo != null) {
                descripcionGrado = catalogDetailTramite.getDescription();
            }

        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        } finally {
            return descripcionGrado;
        }
    }

    /**
     * Ejecuta un reporte de custodios
     *
     * @param name Nombre del reporte a generar.
     */
    public void generateReport() {
        String path = "armas/reports/ordenTrabajoCustodios";
        String filename = MsgControlArmas.getProperty("lbl_ordenTrabajoCustodios");

        //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("codigoOrden", this.numeroOrden.toString());

        //Centro de control
        parameters.put("nombreCentro", this.nombreInstitucion);

        //Numero de orden de trabajo
        parameters.put("numeroOrdenTrabajo", this.numeroOrden);

        //Documento de referencia
        parameters.put("documentoReferencia", this.solicitudTramite.getNumerotramite());

        //Fecha
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        parameters.put("fecha", sdf.format(this.fechaHoy));

        //Comision actividad
        parameters.put("comisionActividad", "Custodia Militar");

        //Empresa solicita
        parameters.put("empresaSolicita", this.detallesPersona.getName());

        //Tiempo estimado
        parameters.put("tiempoEstimado", this.tiempoEstimado);

        //Fecha inicio
        parameters.put("fechaInicio", sdf.format(this.inicio));

        //Fecha fin
        parameters.put("fechaFin", sdf.format(this.fin));

        //Lugar
        parameters.put("lugar", this.lugarDireccion);

        //Ruta
        parameters.put("ruta", this.ruta);

        //Funcionario
        parameters.put("gradoNombreFuncionario", gradoFuncionario + this.jefeCentroControl.getName());
        parameters.put("personcode", this.jefeCentroControl.getPk().getPersoncode());
        parameters.put("centroControl", "JEFE DEL " + this.nombreInstitucion);

        //Usuario
        parameters.put("usuario", this.usuario.getName());
        sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String fechaHora = sdf.format(Calendar.getInstance().getTime());
        parameters.put("fechaHora", fechaHora);

        parameters.put("codigoQR", csolicitud + " " + fechaHora + " " + " " + sdf.format(this.fin) + " " + gradoFuncionario + this.jefeCentroControl.getName());

        String format = "pdf";

        try {
            this.reportController.execute(path, parameters, format, filename, this.getLoginController());
            btnEnviar = Boolean.TRUE;
        } catch (Exception ex) {
            MessageHelper.setMessageError(ex);
        }
    }

    public void probarReporte() {
        try {
            TarmOrdenTrabajo orden = ordenTrabajoController.find("128");

            String path = "armas/reports/ordenTrabajoCustodios";
            String filename = MsgControlArmas.getProperty("lbl_ordenTrabajoCustodios");

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

            //Centro de control
            parameters.put("nombreCentro", this.nombreInstitucion);

            //Numero de orden de trabajo
            parameters.put("numeroOrdenTrabajo", 128L);

            //Documento de referencia
            parameters.put("documentoReferencia", this.solicitudTramite.getNumerotramite());

            //Fecha
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
            parameters.put("fecha", sdf.format(this.fechaHoy));

            //Comision actividad
            parameters.put("comisionActividad", "Custodia Militar");

            //Empresa solicita
            parameters.put("empresaSolicita", this.detallesPersona.getName());

            //Tiempo estimado
            parameters.put("tiempoEstimado", orden.getTiempoestimado());

            //Fecha inicio
            parameters.put("fechaInicio", sdf.format(orden.getFinicio()));

            //Fecha fin
            parameters.put("fechaFin", sdf.format(orden.getFfinalizacion()));

            //Lugar
            parameters.put("lugar", orden.getDireccioncomision());

            //Ruta
            parameters.put("ruta", orden.getRuta());

            //Funcionario
            parameters.put("gradoNombreFuncionario", gradoFuncionario + this.jefeCentroControl.getName());
            parameters.put("personcode", this.jefeCentroControl.getPk().getPersoncode());
            parameters.put("centroControl", "JEFE DEL " + this.nombreInstitucion);

            //Usuario
            parameters.put("usuario", this.usuario.getName());
            sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String fechaHora = sdf.format(Calendar.getInstance().getTime());
            parameters.put("fechaHora", fechaHora);

            String format = "pdf";

            this.reportController.execute(path, parameters, format, filename, this.getLoginController());

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

    }

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

        try {
            if (!btnEnviar) {
                MessageHelper.setMessageError(MsgControlArmas.getProperty("msg_error_avanzar_flujo"));
                return;
            }

            Request request = callerhelper.getRequest();
            // limpiar request para finalizar la tarea.
            super.cleanRequest(request);
            request.modifiedData().put("csolicitud", csolicitud);
            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);
                btnEnviar = Boolean.FALSE;
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public OrdenTrabajoController getOrdenTrabajoController() {
        return ordenTrabajoController;
    }

    public void setOrdenTrabajoController(
            OrdenTrabajoController ordenTrabajoController) {
        this.ordenTrabajoController = ordenTrabajoController;
    }

    public CustodiosController getCustodiosController() {
        return custodiosController;
    }

    public void setCustodiosController(CustodiosController custodiosController) {
        this.custodiosController = custodiosController;
    }

    public Date getFechaHoy() {
        return fechaHoy;
    }

    public void setFechaHoy(Date fechaHoy) {
        this.fechaHoy = fechaHoy;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

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

    public Date getFechaFin() {
        return fechaFin;
    }

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

    public TarmSolicitud getSolicitud() {
        return solicitud;
    }

    public void setSolicitud(TarmSolicitud solicitud) {
        this.solicitud = solicitud;
    }

    public TarmSolicitudTramite getSolicitudTramite() {
        return solicitudTramite;
    }

    public void setSolicitudTramite(TarmSolicitudTramite solicitudTramite) {
        this.solicitudTramite = solicitudTramite;
    }

    public TarmTramite getTramite() {
        return tramite;
    }

    public void setTramite(TarmTramite tramite) {
        this.tramite = tramite;
    }

    public String getUsoActividad() {
        return usoActividad;
    }

    public void setUsoActividad(String usoActividad) {
        this.usoActividad = usoActividad;
    }

    public List<TgeneCatalogDetail> getlGrados() {
        return lGrados;
    }

    public void setlGrados(List<TgeneCatalogDetail> lGrados) {
        this.lGrados = lGrados;
    }

    public Long getNumeroOrden() {
        return numeroOrden;
    }

    public void setNumeroOrden(Long numeroOrden) {
        this.numeroOrden = numeroOrden;
    }

    public String getDocumentoReferencia() {
        return documentoReferencia;
    }

    public void setDocumentoReferencia(String documentoReferencia) {
        this.documentoReferencia = documentoReferencia;
    }

    public String getEmpresa() {
        return empresa;
    }

    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }

    public String getLugarDireccion() {
        return lugarDireccion;
    }

    public void setLugarDireccion(String lugarDireccion) {
        this.lugarDireccion = lugarDireccion;
    }

    public String getRuta() {
        return ruta;
    }

    public void setRuta(String ruta) {
        this.ruta = ruta;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public String getTiempoEstimado() {
        return tiempoEstimado;
    }

    public void setTiempoEstimado(String tiempoEstimado) {
        this.tiempoEstimado = tiempoEstimado;
    }

    public Date getInicio() {
        return inicio;
    }

    public void setInicio(Date inicio) {
        this.inicio = inicio;
    }

    public Date getFin() {
        return fin;
    }

    public void setFin(Date fin) {
        this.fin = fin;
    }

    public Boolean getAceptarHabilitado() {
        return aceptarHabilitado;
    }

    public void setAceptarHabilitado(Boolean aceptarHabilitado) {
        this.aceptarHabilitado = aceptarHabilitado;
    }

    public TcustPersonDetail getDetallesPersona() {
        return detallesPersona;
    }

    public void setDetallesPersona(TcustPersonDetail detallesPersona) {
        this.detallesPersona = detallesPersona;
    }

    public ReportController getReportController() {
        return reportController;
    }

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

    public Boolean getBtnEnviar() {
        return btnEnviar;
    }

    public void setBtnEnviar(Boolean btnEnviar) {
        this.btnEnviar = btnEnviar;
    }

}
