/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.arrebol.taxiservicios.beans.dashboard;

import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.arrebol.taxiservicios.model.enums.TipoCobertura;
import com.crov.prase.controller.prase.CatalogosCotizadorController;
import com.crov.prase.controller.prase.PagosPolizaController;
import com.crov.prase.controller.prase.PolizaController;
import com.crov.prase.model.prase.Coberturas;
import com.crov.prase.model.prase.OpcionesUsoVehiculo;
import com.crov.prase.model.prase.PagosPoliza;
import com.crov.prase.model.prase.PaquetesCobertura;
import com.crov.prase.model.prase.Poliza;
import com.crov.prase.model.prase.UsoVehiculo;
import com.crov.prase.prase.PolizaBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 *
 * @author Picasso
 */
@Named("dashboardBean")
@ViewScoped
public class DashboardBean extends TaxiGenericBean implements Serializable {

    private static final long serialVersionUID = -136031528440947006L;
    final Logger logger = LogManager.getLogger(PolizaBean.class);

    private CatalogosCotizadorController catalogosCotizadorController;
    private PolizaController polizaController;
    private PagosPolizaController pagosPolizaController;

    private List<UsoVehiculo> listUsoVehiculo;
    private String selectUsoVehiculo;
    private List<OpcionesUsoVehiculo> listOpcionesUsoVehiculo;
    private String selectOpcionesUsoVehiculo;
    private List<PaquetesCobertura> listPaquetesCobertura;
    private String selectPaqueteCobertura;
    private PaquetesCobertura paqueteSeleccinado;
    private List<Coberturas> listCoberturas;
    private Coberturas selectCobertura;
    private List<Coberturas> listCoberturasBasica;
    private Coberturas selectCoberturaBasica;
    private List<Coberturas> listCoberturasAccesoria;
    private Coberturas selectCoberturaAccesoria;
    private List<Poliza> listPolizas;
    private Poliza selectPoliza;
    private List<PagosPoliza> listPagosPolizas;
    private PagosPoliza selectedPago;

    private Boolean faseUnoCompleta;
    private Boolean faseDosCompleta;
    private Boolean faseTresCompleta;
    private Boolean faseCuatroCompleta;

    private String vehiculoNombreCompleto;
    private String vehiculoAno;
    private String vehiculoMarca;
    private String vehiculoTipo;
    private String vehiculoVersion;
    private String vehiculoAMIS;
    private String vehiculoUnidadSalvamento;
    private String vehiculoSerie;
    private String vehiculoDomicilio;

    private String cotizacionDerechoPoliza;
    private String cotizacionVigencia;
    private String cotizacionTipoVigencia;
    private String cotizacionMeses;
    private Date cotizacionInicioVigencia;
    private Date cotizacionFinVigencia;
    private String cotizacionTipoSumaAsegurada;
    private Double cotizacionSumaAsegurada;
    private String cotizacionPeriodoGanancia;
    private String cotizacionMoneda;
    private String cotizacionNombreAsegurado;

    @PostConstruct
    public void init() {
        logger.info("init()");
        try {

            setFaseUnoCompleta(false);
            setFaseDosCompleta(false);
            setFaseTresCompleta(false);
            setFaseCuatroCompleta(false);

            setSelectOpcionesUsoVehiculo(null);
            setPaqueteSeleccinado(null);
            resetFaceDos();
            resetFaceTres();

            setCatalogosCotizadorController(new CatalogosCotizadorController());
            setPolizaController(new PolizaController());
            setPagosPolizaController(new PagosPolizaController());

            setListUsoVehiculo(getCatalogosCotizadorController().fillUsoVehiculoByLocation(getLoggedUser().getLocation()));
            setListPaquetesCobertura(getCatalogosCotizadorController().fillPaquetesCoberturaByLocation(getLoggedUser().getLocation()));
            setListPolizas(getPolizaController().findPolizasByLocationAndEndDate(getLoggedUser().getLocation(), new Date(), sumarRestarDiasAFecha(new Date(), 30)));
            setListPagosPolizas(getPagosPolizaController().fillPagosPolizaFechaAPagarByLocationFechaInicioAndFechaFin(getLoggedUser().getLocation(), new Date(), sumarRestarDiasAFecha(new Date(), 15)));

        } catch (Exception e) {
            logger.error("init(): " + e);
        }
    }

    public String validarColorPagoPoliza(GenericEnumType estatus, Date fechaPago) {
        Date fechaHoy = new Date();
        Date fechaMenos3dias = sumarRestarDiasAFecha(fechaPago, -3);
        Date fechaMenos7dias = sumarRestarDiasAFecha(fechaPago, -7);
        // Validadar color 
        if (estatus.equals(GenericEnumType.DISABLED) || estatus.equals(GenericEnumType.INCOMPLETE)) {
            if (fechaHoy.equals(fechaPago) || fechaHoy.after(fechaPago)) {
                return "bgRojo";
            } else if (fechaHoy.equals(fechaMenos3dias) || fechaHoy.after(fechaMenos3dias)) {
                return "bgNaranja";
            } else if (fechaHoy.equals(fechaMenos7dias) || fechaHoy.after(fechaMenos7dias)) {
                return "bgAmarillo";
            } else {
                return "";
            }
        } else {
            return "";
        }
    }

    private Date sumarRestarDiasAFecha(Date fecha, int dias) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(fecha);
        calendar.add(Calendar.DAY_OF_YEAR, dias);
        Date fechaModificada = calendar.getTime();
        return fechaModificada;
    }

    public void cargarOpcionesUso() {
        logger.info("cargarOpcionesUso()");
        try {
            setListOpcionesUsoVehiculo(getCatalogosCotizadorController().fillOpcionesUsoVehiculoByUsoVehiculo(getSelectUsoVehiculo()));
            setSelectOpcionesUsoVehiculo(null);
            validarFaseUno();
        } catch (Exception e) {
            validarFaseUno();
            logger.error("cargarOpcionesUso(): " + e);
        }
    }

    public void cargarCoberturas() {
        logger.info("cargarCoberturas()");
        try {

            // Se cargan las coberturas básicas y accesorias 
            setListCoberturasBasica(getCatalogosCotizadorController().fillCoberturasByPaqueteAndTipo(getSelectPaqueteCobertura(), TipoCobertura.BASICA));
            setListCoberturasAccesoria(getCatalogosCotizadorController().fillCoberturasByPaqueteAndTipo(getSelectPaqueteCobertura(), TipoCobertura.ACCESORIAS));
            setSelectCoberturaBasica(null);
            setSelectCoberturaAccesoria(null);

            // Se guarda el paquete seleccionado para cargar en la vista los datos de las primas 
            if (getListCoberturasBasica().isEmpty()) {
                setPaqueteSeleccinado(getCatalogosCotizadorController().findPaqueteCobertura(getSelectPaqueteCobertura()));
            } else {
                setPaqueteSeleccinado(getListCoberturasBasica().get(0).getPaquete());
            }

            // Se validan y cargan las opciones para sumas aseguradas y deducibles en caso de tenerlas 
            for (Coberturas cobertura : getListCoberturasBasica()) {

                if (cobertura.getSumaAsegurada() != null) {
                    List<String> list = crearListaString(cobertura.getSumaAsegurada());
                    if (list.size() > 1) {
                        cobertura.setListSumasAseguradasOP(list);
                    } else {
                        cobertura.setSelectSumaAsegurada(cobertura.getSumaAsegurada());
                    }
                }

                if (cobertura.getDeducible() != null) {
                    List<String> list = crearListaString(cobertura.getDeducible());
                    if (list.size() > 1) {
                        cobertura.setListDeduciblesOP(list);
                    } else {
                        cobertura.setSelectDeducible(cobertura.getDeducible());
                    }
                }

            }

            // Se validan y cargan las opciones para sumas aseguradas y deducibles en caso de tenerlas 
            for (Coberturas cobertura : getListCoberturasAccesoria()) {

                if (cobertura.getSumaAsegurada() != null) {
                    List<String> list = crearListaString(cobertura.getSumaAsegurada());
                    if (list.size() > 1) {
                        cobertura.setListSumasAseguradasOP(list);
                    } else {
                        cobertura.setSelectSumaAsegurada(cobertura.getSumaAsegurada());
                    }
                }

                if (cobertura.getDeducible() != null) {
                    List<String> list = crearListaString(cobertura.getDeducible());
                    if (list.size() > 1) {
                        cobertura.setListDeduciblesOP(list);
                    } else {
                        cobertura.setSelectDeducible(cobertura.getDeducible());
                    }
                }

            }

            validarFaseCuatro();
        } catch (Exception e) {
            validarFaseCuatro();
            logger.error("cargarCoberturas(): " + e);
        }
    }

    public List<String> crearListaString(String cadena) {
        List<String> lista = new ArrayList<>();
        try {
            lista = Arrays.asList(cadena.split(","));
            return lista;
        } catch (Exception e) {
            logger.error("Ocurrió un error al crear una de la listas: " + e);
            return lista;
        }
    }

    public void validarFaseUno() {
        logger.info("validarFaceUno()");
        try {
            if (getSelectOpcionesUsoVehiculo() != null) {
                setFaseUnoCompleta(true);
            } else {
                setFaseUnoCompleta(false);
            }
        } catch (Exception e) {
            logger.error("validarFaceUno(): " + e);
        }
        resetFaceDos();
        resetFaceTres();
        resetFaceCuatro();
        validarFaseDos();
        validarFaseTres();
        validarFaseCuatro();
    }

    public void validarFaseDos() {
        logger.info("validarFaceDos()");
        try {
            if ((getVehiculoNombreCompleto() != null && !getVehiculoNombreCompleto().isEmpty())
                    && (getVehiculoAno() != null && !getVehiculoAno().isEmpty())
                    && (getVehiculoMarca() != null && !getVehiculoMarca().isEmpty())
                    && (getVehiculoTipo() != null && !getVehiculoTipo().isEmpty())
                    && (getVehiculoVersion() != null && !getVehiculoVersion().isEmpty())
                    && (getVehiculoAMIS() != null && !getVehiculoAMIS().isEmpty())
                    && (getVehiculoUnidadSalvamento() != null && !getVehiculoUnidadSalvamento().isEmpty())
                    && (getVehiculoSerie() != null && !getVehiculoSerie().isEmpty())
                    && (getVehiculoDomicilio() != null && !getVehiculoDomicilio().isEmpty())) {
                setFaseDosCompleta(true);
                logger.info("Face dos completa");
            } else {
                logger.info("Face dos incompleta");
                //showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "Complete el formulario para continuar");
                setFaseDosCompleta(false);
            }
        } catch (Exception e) {
            //showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Complete el formulario para continuar");
            setFaseDosCompleta(false);
            logger.error("validarFaceDos(): " + e);
        }
        resetFaceTres();
        resetFaceCuatro();
        validarFaseTres();
        validarFaseCuatro();
    }

    public void validarFaseTres() {
        logger.info("validarFaceDos()");
        try {
            if (getCotizacionInicioVigencia() != null && getCotizacionFinVigencia() != null
                    && getCotizacionTipoSumaAsegurada() != null && !getCotizacionTipoSumaAsegurada().isEmpty()
                    && getCotizacionSumaAsegurada() != null
                    && getCotizacionPeriodoGanancia() != null && !getCotizacionPeriodoGanancia().isEmpty()) {
                setFaseTresCompleta(true);
                logger.info("Face tres completa");
            } else {
                logger.info("Face tres incompleta");
                //showMessage(FacesMessage.SEVERITY_WARN, "Advertencia", "Complete el formulario para continuar");
                setFaseTresCompleta(false);
            }
        } catch (Exception e) {
            //showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Complete el formulario para continuar");
            setFaseDosCompleta(false);
            logger.error("validarFaceDos(): " + e);
        }
        resetFaceCuatro();
        validarFaseCuatro();
    }

    public void validarFaseCuatro() {
        logger.info("validarFaseCuatro()");
        try {

        } catch (Exception e) {
            logger.error("validarFaseCuatro(): " + e);
        }
    }

    private void resetFaceDos() {
        logger.info("resetFaceDos()");
        setVehiculoNombreCompleto(null);
        setVehiculoAno(null);
        setVehiculoMarca(null);
        setVehiculoTipo(null);
        setVehiculoVersion(null);
        setVehiculoAMIS(null);
        setVehiculoUnidadSalvamento(null);
        setVehiculoSerie(null);
        setVehiculoDomicilio(null);
    }

    private void resetFaceTres() {
        logger.info("resetFaceTres()");
        setCotizacionDerechoPoliza(null);
        setCotizacionVigencia(null);
        setCotizacionTipoVigencia(null);
        setCotizacionMeses(null);
        setCotizacionInicioVigencia(null);
        setCotizacionFinVigencia(null);
        setCotizacionTipoSumaAsegurada(null);
        setCotizacionSumaAsegurada(null);
        setCotizacionPeriodoGanancia(null);
        setCotizacionMoneda(null);
        setCotizacionNombreAsegurado(null);
    }

    private void resetFaceCuatro() {
        logger.info("resetFaceCuatro()");
    }

    public CatalogosCotizadorController getCatalogosCotizadorController() {
        return catalogosCotizadorController;
    }

    public void setCatalogosCotizadorController(CatalogosCotizadorController catalogosCotizadorController) {
        this.catalogosCotizadorController = catalogosCotizadorController;
    }

    public List<UsoVehiculo> getListUsoVehiculo() {
        return listUsoVehiculo;
    }

    public void setListUsoVehiculo(List<UsoVehiculo> listUsoVehiculo) {
        this.listUsoVehiculo = listUsoVehiculo;
    }

    public List<OpcionesUsoVehiculo> getListOpcionesUsoVehiculo() {
        return listOpcionesUsoVehiculo;
    }

    public void setListOpcionesUsoVehiculo(List<OpcionesUsoVehiculo> listOpcionesUsoVehiculo) {
        this.listOpcionesUsoVehiculo = listOpcionesUsoVehiculo;
    }

    public String getSelectUsoVehiculo() {
        return selectUsoVehiculo;
    }

    public void setSelectUsoVehiculo(String selectUsoVehiculo) {
        this.selectUsoVehiculo = selectUsoVehiculo;
    }

    public String getSelectOpcionesUsoVehiculo() {
        return selectOpcionesUsoVehiculo;
    }

    public void setSelectOpcionesUsoVehiculo(String selectOpcionesUsoVehiculo) {
        this.selectOpcionesUsoVehiculo = selectOpcionesUsoVehiculo;
    }

    public Boolean getFaseUnoCompleta() {
        return faseUnoCompleta;
    }

    public void setFaseUnoCompleta(Boolean faseUnoCompleta) {
        this.faseUnoCompleta = faseUnoCompleta;
    }

    public Boolean getFaseDosCompleta() {
        return faseDosCompleta;
    }

    public void setFaseDosCompleta(Boolean faseDosCompleta) {
        this.faseDosCompleta = faseDosCompleta;
    }

    public Boolean getFaseTresCompleta() {
        return faseTresCompleta;
    }

    public void setFaseTresCompleta(Boolean faseTresCompleta) {
        this.faseTresCompleta = faseTresCompleta;
    }

    public Boolean getFaseCuatroCompleta() {
        return faseCuatroCompleta;
    }

    public void setFaseCuatroCompleta(Boolean faseCuatroCompleta) {
        this.faseCuatroCompleta = faseCuatroCompleta;
    }

    public String getVehiculoNombreCompleto() {
        return vehiculoNombreCompleto;
    }

    public void setVehiculoNombreCompleto(String vehiculoNombreCompleto) {
        this.vehiculoNombreCompleto = vehiculoNombreCompleto;
    }

    public String getVehiculoAno() {
        return vehiculoAno;
    }

    public void setVehiculoAno(String vehiculoAno) {
        this.vehiculoAno = vehiculoAno;
    }

    public String getVehiculoMarca() {
        return vehiculoMarca;
    }

    public void setVehiculoMarca(String vehiculoMarca) {
        this.vehiculoMarca = vehiculoMarca;
    }

    public String getVehiculoTipo() {
        return vehiculoTipo;
    }

    public void setVehiculoTipo(String vehiculoTipo) {
        this.vehiculoTipo = vehiculoTipo;
    }

    public String getVehiculoVersion() {
        return vehiculoVersion;
    }

    public void setVehiculoVersion(String vehiculoVersion) {
        this.vehiculoVersion = vehiculoVersion;
    }

    public String getVehiculoAMIS() {
        return vehiculoAMIS;
    }

    public void setVehiculoAMIS(String vehiculoAMIS) {
        this.vehiculoAMIS = vehiculoAMIS;
    }

    public String getVehiculoUnidadSalvamento() {
        return vehiculoUnidadSalvamento;
    }

    public void setVehiculoUnidadSalvamento(String vehiculoUnidadSalvamento) {
        this.vehiculoUnidadSalvamento = vehiculoUnidadSalvamento;
    }

    public String getVehiculoSerie() {
        return vehiculoSerie;
    }

    public void setVehiculoSerie(String vehiculoSerie) {
        this.vehiculoSerie = vehiculoSerie;
    }

    public String getVehiculoDomicilio() {
        return vehiculoDomicilio;
    }

    public void setVehiculoDomicilio(String vehiculoDomicilio) {
        this.vehiculoDomicilio = vehiculoDomicilio;
    }

    public Date getCotizacionInicioVigencia() {
        return cotizacionInicioVigencia;
    }

    public void setCotizacionInicioVigencia(Date cotizacionInicioVigencia) {
        this.cotizacionInicioVigencia = cotizacionInicioVigencia;
    }

    public Date getCotizacionFinVigencia() {
        return cotizacionFinVigencia;
    }

    public void setCotizacionFinVigencia(Date cotizacionFinVigencia) {
        this.cotizacionFinVigencia = cotizacionFinVigencia;
    }

    public String getCotizacionTipoSumaAsegurada() {
        return cotizacionTipoSumaAsegurada;
    }

    public void setCotizacionTipoSumaAsegurada(String cotizacionTipoSumaAsegurada) {
        this.cotizacionTipoSumaAsegurada = cotizacionTipoSumaAsegurada;
    }

    public Double getCotizacionSumaAsegurada() {
        return cotizacionSumaAsegurada;
    }

    public void setCotizacionSumaAsegurada(Double cotizacionSumaAsegurada) {
        this.cotizacionSumaAsegurada = cotizacionSumaAsegurada;
    }

    public String getCotizacionPeriodoGanancia() {
        return cotizacionPeriodoGanancia;
    }

    public void setCotizacionPeriodoGanancia(String cotizacionPeriodoGanancia) {
        this.cotizacionPeriodoGanancia = cotizacionPeriodoGanancia;
    }

    public String getCotizacionMoneda() {
        return cotizacionMoneda;
    }

    public void setCotizacionMoneda(String cotizacionMoneda) {
        this.cotizacionMoneda = cotizacionMoneda;
    }

    public String getCotizacionNombreAsegurado() {
        return cotizacionNombreAsegurado;
    }

    public void setCotizacionNombreAsegurado(String cotizacionNombreAsegurado) {
        this.cotizacionNombreAsegurado = cotizacionNombreAsegurado;
    }

    public String getCotizacionDerechoPoliza() {
        return cotizacionDerechoPoliza;
    }

    public void setCotizacionDerechoPoliza(String cotizacionDerechoPoliza) {
        this.cotizacionDerechoPoliza = cotizacionDerechoPoliza;
    }

    public String getCotizacionVigencia() {
        return cotizacionVigencia;
    }

    public void setCotizacionVigencia(String cotizacionVigencia) {
        this.cotizacionVigencia = cotizacionVigencia;
    }

    public String getCotizacionTipoVigencia() {
        return cotizacionTipoVigencia;
    }

    public void setCotizacionTipoVigencia(String cotizacionTipoVigencia) {
        this.cotizacionTipoVigencia = cotizacionTipoVigencia;
    }

    public String getCotizacionMeses() {
        return cotizacionMeses;
    }

    public void setCotizacionMeses(String cotizacionMeses) {
        this.cotizacionMeses = cotizacionMeses;
    }

    public List<PaquetesCobertura> getListPaquetesCobertura() {
        return listPaquetesCobertura;
    }

    public void setListPaquetesCobertura(List<PaquetesCobertura> listPaquetesCobertura) {
        this.listPaquetesCobertura = listPaquetesCobertura;
    }

    public String getSelectPaqueteCobertura() {
        return selectPaqueteCobertura;
    }

    public void setSelectPaqueteCobertura(String selectPaqueteCobertura) {
        this.selectPaqueteCobertura = selectPaqueteCobertura;
    }

    public List<Coberturas> getListCoberturas() {
        return listCoberturas;
    }

    public void setListCoberturas(List<Coberturas> listCoberturas) {
        this.listCoberturas = listCoberturas;
    }

    public Coberturas getSelectCobertura() {
        return selectCobertura;
    }

    public void setSelectCobertura(Coberturas selectCobertura) {
        this.selectCobertura = selectCobertura;
    }

    public List<Coberturas> getListCoberturasBasica() {
        return listCoberturasBasica;
    }

    public void setListCoberturasBasica(List<Coberturas> listCoberturasBasica) {
        this.listCoberturasBasica = listCoberturasBasica;
    }

    public List<Coberturas> getListCoberturasAccesoria() {
        return listCoberturasAccesoria;
    }

    public void setListCoberturasAccesoria(List<Coberturas> listCoberturasAccesoria) {
        this.listCoberturasAccesoria = listCoberturasAccesoria;
    }

    public Coberturas getSelectCoberturaBasica() {
        return selectCoberturaBasica;
    }

    public void setSelectCoberturaBasica(Coberturas selectCoberturaBasica) {
        this.selectCoberturaBasica = selectCoberturaBasica;
    }

    public Coberturas getSelectCoberturaAccesoria() {
        return selectCoberturaAccesoria;
    }

    public void setSelectCoberturaAccesoria(Coberturas selectCoberturaAccesoria) {
        this.selectCoberturaAccesoria = selectCoberturaAccesoria;
    }

    public List<Poliza> getListPolizas() {
        return listPolizas;
    }

    public void setListPolizas(List<Poliza> listPolizas) {
        this.listPolizas = listPolizas;
    }

    public Poliza getSelectPoliza() {
        return selectPoliza;
    }

    public void setSelectPoliza(Poliza selectPoliza) {
        this.selectPoliza = selectPoliza;
    }

    public PolizaController getPolizaController() {
        return polizaController;
    }

    public void setPolizaController(PolizaController polizaController) {
        this.polizaController = polizaController;
    }

    public PaquetesCobertura getPaqueteSeleccinado() {
        return paqueteSeleccinado;
    }

    public void setPaqueteSeleccinado(PaquetesCobertura paqueteSeleccinado) {
        this.paqueteSeleccinado = paqueteSeleccinado;
    }

    public PagosPolizaController getPagosPolizaController() {
        return pagosPolizaController;
    }

    public void setPagosPolizaController(PagosPolizaController pagosPolizaController) {
        this.pagosPolizaController = pagosPolizaController;
    }

    public List<PagosPoliza> getListPagosPolizas() {
        return listPagosPolizas;
    }

    public void setListPagosPolizas(List<PagosPoliza> listPagosPolizas) {
        this.listPagosPolizas = listPagosPolizas;
    }

    public PagosPoliza getSelectedPago() {
        return selectedPago;
    }

    public void setSelectedPago(PagosPoliza selectedPago) {
        this.selectedPago = selectedPago;
    }

}
