package mx.gob.jumapacelaya.views;

import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.*;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.radiobutton.RadioButtonGroup;
import com.vaadin.flow.component.radiobutton.RadioGroupVariant;
import com.vaadin.flow.component.textfield.NumberField;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.theme.lumo.LumoUtility;
import de.f0rce.signaturepad.SignaturePad;
import mx.gob.jumapacelaya.Services.GuardarSolicitudService;
import mx.gob.jumapacelaya.Services.PredioService;
import mx.gob.jumapacelaya.models.Predio;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@PageTitle("Estudio Socioeconomico")
@Route(value = "cuestionario", layout = MainLayout.class)
public class CuestionarioView extends VerticalLayout {

    private final PredioService predioService;
    private final GuardarSolicitudService guardarSolicitudService;
    private Predio predio;
    private static final Logger logger = LoggerFactory.getLogger(CuestionarioView.class);
    private String vEstado="S";
    private SignaturePad vFirmaCuest;
    private RadioButtonGroup<Integer> opcionesIng = new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesEnf = new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesDepen= new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesSalud= new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesZona= new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesEscolar= new RadioButtonGroup<>();
    private RadioButtonGroup<Integer> opcionesEdad= new RadioButtonGroup<>();
    private Button btnGuardar = new Button();

    public CuestionarioView(PredioService predioService, GuardarSolicitudService guardarSolicitudService) {
        this.setSizeFull();
        this.setSpacing(false);
        this.guardarSolicitudService = guardarSolicitudService;
        this.predioService = predioService;

        vFirmaCuest = new SignaturePad();
        vFirmaCuest.setBackgroundColor("#FFFFFF");
        vFirmaCuest.setHeight("200px");
        vFirmaCuest.setPenColor("int red");
        vFirmaCuest.getElement().getStyle().set("border", "1px solid black");
        vFirmaCuest.setVisible(false);
        vFirmaCuest.setReadOnly(false);
        vFirmaCuest.getStyle().remove("pointer-events");

        cabecera();
        titulo();
        form();
    }

    private void cabecera() {

        HorizontalLayout encabezadoLayout = new HorizontalLayout();
        encabezadoLayout.setWidthFull();
        encabezadoLayout.setPadding(true);

        // Obtener la fecha actual del sistema
        LocalDate fechaSistema = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE d 'de' MMMM 'del' yyyy");
        String fechaFormateada = fechaSistema.format(formatter);

        Span fecha = new Span();
        fecha.setText("Celaya, Guanajuato a " + fechaFormateada);

        Image logoJmpa = new Image("images/LOGO_24'27.PNG", "JUMAPA logo");
        logoJmpa.setWidth("110px");
        logoJmpa.setHeight("50px");

        encabezadoLayout.add(logoJmpa);
        encabezadoLayout.addAndExpand(new HorizontalLayout());
        encabezadoLayout.add(fecha);
        encabezadoLayout.addAndExpand(new HorizontalLayout());
        this.add(encabezadoLayout);
    }

    private void titulo() {

        VerticalLayout tituloLayout = new VerticalLayout();
        tituloLayout.setAlignItems(Alignment.CENTER);

        H4 lblTitulo = new H4();
        lblTitulo.setText("VALORACIÓN DE CONDICIÓN SOCIOECONÓMICA DE USUARIOS DOMÉSTICOS");


        tituloLayout.add(lblTitulo);

        this.add(tituloLayout);
    }

    private boolean allRadioButtonsSelected() {
        return opcionesIng.getValue() != null &&
                opcionesEnf.getValue() != null &&
                opcionesDepen.getValue() != null &&
                opcionesSalud.getValue() != null &&
                opcionesZona.getValue() != null &&
                opcionesEscolar.getValue() != null &&
                opcionesEdad.getValue() != null;
    }

    private void form() {
        // Contenedor principal
        VerticalLayout formLayout = new VerticalLayout();

        // Contenedoreres para cada bloque de preguntas
        HorizontalLayout contenedor1 = new HorizontalLayout();
        contenedor1.setWidthFull();
        contenedor1.setSpacing(false);
        contenedor1.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor2 = new HorizontalLayout();
        contenedor2.setWidthFull();
        contenedor2.setSpacing(false);
        contenedor2.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor3 = new HorizontalLayout();
        contenedor3.setWidthFull();
        contenedor3.setSpacing(false);
        contenedor3.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor4 = new HorizontalLayout();
        contenedor4.setWidthFull();
        contenedor4.setSpacing(false);
        contenedor4.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor5 = new HorizontalLayout();
        contenedor5.setWidthFull();
        contenedor5.setSpacing(false);
        contenedor5.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor6 = new HorizontalLayout();
        contenedor6.setWidthFull();
        contenedor6.setSpacing(false);
        contenedor6.getStyle().set("border", "1px solid black");

        HorizontalLayout contenedor7 = new HorizontalLayout();
        contenedor7.setWidthFull();
        contenedor7.setSpacing(false);
        contenedor7.getStyle().set("border", "1px solid black");

        // Contenedor para los resultados
        HorizontalLayout resultadosLayout = new HorizontalLayout();
        resultadosLayout.setWidthFull();
        H5 resultado = new H5("Porcentaje de descuento:");
        H5 puntosTotal = new H5("Puntos obtenidos:");
        H5 agua = new H5("Coeficiente de Agua (11):");
        H5 drenaje = new H5("Coeficiente de Drenaje (12):");
        H5 tratada = new H5("Coeficiente de Agua Tratada (112):");
        VerticalLayout etiquetaLayout = new VerticalLayout(puntosTotal, resultado, agua, drenaje, tratada);
        etiquetaLayout.setAlignItems(Alignment.END);

        // Columnas ingreso familiar
        VerticalLayout columnaCriterio = new VerticalLayout();
        VerticalLayout columnaRangos = new VerticalLayout();
        columnaRangos.setSpacing(false);
        VerticalLayout columnaPuntos = new VerticalLayout();
        columnaPuntos.setSpacing(false);

        // Columnas enfermedades
        VerticalLayout colunaCriterioEnf = new VerticalLayout();
        VerticalLayout colunaRangoEnf = new VerticalLayout();
        colunaRangoEnf.setSpacing(false);
        VerticalLayout colunaPuntosEnf = new VerticalLayout();
        colunaPuntosEnf.setSpacing(false);

        // Columnas dependientes
        VerticalLayout columnaCriteriosDepen = new VerticalLayout();
        VerticalLayout columnaRangosDepen = new VerticalLayout();
        columnaRangosDepen.setSpacing(false);
        VerticalLayout columnaPuntosDepen = new VerticalLayout();
        columnaPuntosDepen.setSpacing(false);

        // Columnas Acesos/Salud
        VerticalLayout columnaCriteriosSalud = new VerticalLayout();
        VerticalLayout columnaRangosSalud = new VerticalLayout();
        columnaRangosSalud.setSpacing(false);
        VerticalLayout columnaPuntosSalud = new VerticalLayout();
        columnaPuntosSalud.setSpacing(false);

        // Columnas Zona Habitacional
        VerticalLayout columnaCriteriosZona = new VerticalLayout();
        VerticalLayout columnaRangosZona = new VerticalLayout();
        columnaRangosZona.setSpacing(false);
        VerticalLayout columnaPuntosZona = new VerticalLayout();
        columnaPuntosZona.setSpacing(false);

        // Columnas grado escolaridad
        VerticalLayout columnaCriteriosEscolar = new VerticalLayout();
        VerticalLayout columnaRangosEscolar = new VerticalLayout();
        columnaRangosEscolar.setSpacing(false);
        VerticalLayout columnaPuntosEscolar = new VerticalLayout();
        columnaPuntosEscolar.setSpacing(false);

        // Columnas edad
        VerticalLayout columnaCriteriosEdad = new VerticalLayout();
        VerticalLayout columnaRangosEdad = new VerticalLayout();
        columnaRangosEdad.setSpacing(false);
        VerticalLayout columnaPuntosEdad = new VerticalLayout();
        columnaPuntosEdad.setSpacing(false);

        // Columna Etiquetas
        Span etiquetaCriterio = new Span("Ingreso familiar mensual"); // Columna Criterio
        Span etiquetaCriterioEnf = new Span("Padece alguna enfermedad crónica o discapacidad comprobable");
        Span etiquetaCriterioDepen = new Span("Número de dependientes económicos");
        Span etiquetaCriterioSalud = new Span("Acceso a los sistemas de Salud");
        Span etiquetaCriterioZona = new Span("Zona habitacional, condiciones de la vivienda y muebles");
        Span etiquetaCriteriosEscolar = new Span("Grado de escolaridad");
        Span etiquetaCriteriosEdad = new Span("Edad del solicitante en años cumplidos");

        /* Columnas rangos */
        // Columna Rangos Ingreso
        Span rango1 = new Span("$6,223.20 en adelante");
        Span rango2 = new Span("$ 2,500.01 a $ 6,223.19");
        Span rango3 = new Span("$ 2,000.01 a $ 2,500.00");
        Span rango4 = new Span("igual o menor a $ 2,000.00");

        // Columna Rangos Enfermedades
        Span rangoenf1 = new Span("No padece enfermedad o discapacidad");
        Span rangoenf2 = new Span("Quien padece, no aporta económicamente");
        Span rangoenf3 = new Span("Quien padece, si aporta económicamente");

        // Columna Rangos Dependientes
        Span rangoDepen1 = new Span("No tiene dependientes");
        Span rangoDepen2 = new Span("1 a 3");
        Span rangoDepen3 = new Span("4 a 6");
        Span rangoDepen4 = new Span("7 a 9");

        // Columnas Rangos Acceso/Salud
        Span rangoSalud1 = new Span("Particular");
        Span rangoSalud2 = new Span("IMSS o ISSTE");
        Span rangoSalud3 = new Span("ISAPEG");
        Span rangoSalud4 = new Span("Ninguno");

        // Columnas Rangos Zona habitacional
        Span rangoZona1 = new Span("Excelente");
        Span rangoZona2 = new Span("Buena");
        Span rangoZona3 = new Span("Regular");
        Span rangoZona4 = new Span("Mala");

        // Columna Rangos Escolaridad
        Span rangoEscolar1 = new Span("Profesional");
        Span rangoEscolar2 = new Span("Preparatoria");
        Span rangoEscolar3 = new Span("Secundaria");
        Span rangoEscolar4 = new Span("Primaria o menos");

        // Columna Rangos Edad
        Span rangoEdad1 = new Span("18 a 30");
        Span rangoEdas2 = new Span("31 a 40");
        Span rangoEdad3 = new Span("41 a 60");
        Span rangoEdad4 = new Span("A partir de 61");

        /* Columnas puntos */
        // Columna puntos Ingresos
        opcionesIng.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesIng.setItems(0, 5, 10, 15);

        // Columna puntos enfermedades
        opcionesEnf.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesEnf.setItems(0, 5, 10);

        // Columna puntos dependientes
        opcionesDepen.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesDepen.setItems(0, 5, 10, 15);

        // Columna puntos salud
        opcionesSalud.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesSalud.setItems(3, 5, 7, 10);

        // Columna puntos zona habitacional
        opcionesZona.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesZona.setItems(0, 5, 10, 15);

        // Columna puntos grado escolar
        opcionesEscolar.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesEscolar.setItems(0, 5, 10, 15);

        // Columna puntos edad
        opcionesEdad.addThemeVariants(RadioGroupVariant.LUMO_VERTICAL);
        opcionesEdad.setItems(0, 4, 7, 10);

        columnaCriterio.add(new H5("Criterio"), etiquetaCriterio);
        columnaRangos.add(new H5("Rangos"), rango1, rango2, rango3, rango4);
        columnaPuntos.add(new H5("Puntos"), opcionesIng);

        colunaCriterioEnf.add(etiquetaCriterioEnf);
        colunaRangoEnf.add(rangoenf1, rangoenf2, rangoenf3);
        colunaPuntosEnf.add(opcionesEnf);

        columnaCriteriosDepen.add(etiquetaCriterioDepen);
        columnaRangosDepen.add(rangoDepen1, rangoDepen2, rangoDepen3, rangoDepen4);
        columnaPuntosDepen.add(opcionesDepen);

        columnaCriteriosSalud.add(etiquetaCriterioSalud);
        columnaRangosSalud.add(rangoSalud1, rangoSalud2, rangoSalud3, rangoSalud4);
        columnaPuntosSalud.add(opcionesSalud);

        columnaCriteriosZona.add(etiquetaCriterioZona);
        columnaRangosZona.add(rangoZona1, rangoZona2, rangoZona3, rangoZona4);
        columnaPuntosZona.add(opcionesZona);

        columnaCriteriosEscolar.add(etiquetaCriteriosEscolar);
        columnaRangosEscolar.add(rangoEscolar1, rangoEscolar2, rangoEscolar3, rangoEscolar4);
        columnaPuntosEscolar.add(opcionesEscolar);

        columnaCriteriosEdad.add(etiquetaCriteriosEdad);
        columnaRangosEdad.add(rangoEdad1, rangoEdas2, rangoEdad3, rangoEdad4);
        columnaPuntosEdad.add(opcionesEdad);

        H3 puntos = new H3("0");
        H3 descuento = new H3("0%");
        NumberField txtAgua = new NumberField();
        txtAgua.setWidth("50px");
        NumberField txtDrena = new NumberField();
        txtDrena.setWidth("50px");
        NumberField txtTrata = new NumberField();
        txtTrata.setWidth("50px");

        // Boton para calcular el puntaje total
        Runnable sumarPuntos = () -> {
            int total = 0;

            // Suma los valores seleccionados en cada Radio Button
            total += opcionesIng.getValue() != null ? opcionesIng.getValue() : 0;
            total += opcionesEnf.getValue() != null ? opcionesEnf.getValue() : 0;
            total += opcionesDepen.getValue() != null ? opcionesDepen.getValue() : 0;
            total += opcionesSalud.getValue() != null ? opcionesSalud.getValue() : 0;
            total += opcionesZona.getValue() != null ? opcionesZona.getValue() : 0;
            total += opcionesEscolar.getValue() != null ? opcionesEscolar.getValue() : 0;
            total += opcionesEdad.getValue() != null ? opcionesEdad.getValue() : 0;

            puntos.setText(String.valueOf(total));

            if (total > 60) {
                descuento.setText("12%");
                txtAgua.setValue(88.0);
                txtDrena.setValue(88.0);
                txtTrata.setValue(88.0);
                vEstado="A";

            } else {
                descuento.setText("0%");
                txtAgua.clear();
                txtDrena.clear();
                txtTrata.clear();
                vEstado="R";
            }
        };

        opcionesIng.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesDepen.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesEdad.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesEnf.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesSalud.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesEscolar.addValueChangeListener(event ->  sumarPuntos.run());
        opcionesZona.addValueChangeListener(event ->  sumarPuntos.run());

        opcionesIng.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesDepen.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesEdad.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesEnf.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesSalud.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesEscolar.addValueChangeListener(event ->  actualizarVisibilidad.run());
        opcionesZona.addValueChangeListener(event ->  actualizarVisibilidad.run());

        // Recuperar los datos de la sesión
        this.predio = (Predio) UI.getCurrent().getSession().getAttribute("predio");
        String tipoSolicitud = (String) UI.getCurrent().getSession().getAttribute("tipoSolicitud");
        String nombreSolicitante = (String) UI.getCurrent().getSession().getAttribute("nombreSolicitante");
        String parentesco = (String) UI.getCurrent().getSession().getAttribute("txtParentesco");
        String tipoIdentificacion = (String) UI.getCurrent().getSession().getAttribute("cmbTipoIdentificacion");
        String numIdentificacion = (String) UI.getCurrent().getSession().getAttribute("numIdentificacion");
        String usuarioId = (String) UI.getCurrent().getSession().getAttribute("usuarioId");
        String firma = (String) UI.getCurrent().getSession().getAttribute("firma");
        String email = (String) UI.getCurrent().getSession().getAttribute("email");
        String estado = (String) UI.getCurrent().getSession().getAttribute("estado");
        String detdesc = (String) UI.getCurrent().getSession().getAttribute("detdesc");
        String firmaUsuario = (String) UI.getCurrent().getSession().getAttribute("firmaUsuario");
        String detCalif = (String) UI.getCurrent().getSession().getAttribute("detCalif");

        logger.info("Predio: "+this.predio+" con tipo de solicitud: ["+tipoSolicitud+"] y nombre de Solicitante: "+ nombreSolicitante);

        // Boton para guardar la solicitud
        btnGuardar = new Button("Guardar", event -> {
            boolean vGuardado=false;
            String vDetDesc="";
            String vDetCalif="";

            //Agregamos los valores del detalle de descuento:
            vDetDesc="comercial.tbdetsoldesc(tdetsoldesc("+predio.getTarifaid()+", 11, "+txtAgua.getValue()+"), tdetsoldesc("+predio.getTarifaid()+", 12, "+txtDrena.getValue()+"), tdetsoldesc("+predio.getTarifaid()+", 112, "+txtTrata.getValue()+"))";

            //Agregamos los valores del detalle de calificacion:
            vDetCalif="comercial.tbdetcalsoldig(tdetcalsoldig(1,"+opcionesIng.getValue()+",''), tdetcalsoldig(2,"+opcionesEnf.getValue()+",''), tdetcalsoldig(3,"+opcionesDepen.getValue()+",''), tdetcalsoldig(4,"+opcionesSalud.getValue()+",''), tdetcalsoldig(5,"+opcionesZona.getValue()+",''), tdetcalsoldig(6,"+opcionesEscolar.getValue()+",''), tdetcalsoldig(7,"+opcionesEdad.getValue()+",'')))";

            vGuardado=guardarSolicitudService.guardarSolicitud(
                    predio.getPredioid(),      // Long predioId
                    tipoSolicitud,               // String tipoSolicitud
                    nombreSolicitante,         // String nombreSolicitante
                    parentesco,                // String parentesco
                    tipoIdentificacion,        // String tipoIdentificacion
                    numIdentificacion,         // String numIdentificacion
                    usuarioId,                 // String usuarioId
                    firma,                     // String firma
                    email,                     // String email
                    "",                      // boolean vigencia (ejemplo: true)
                    vEstado,                    // String estado
                    vDetDesc,                   // String detdesc
                    firmaUsuario,              // String firmaUsuario
                    vDetCalif
            );                
        });
        btnGuardar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        btnGuardar.setVisible(false);

        VerticalLayout botonLayout = new VerticalLayout();
        botonLayout.setAlignItems(Alignment.END);
        botonLayout.setWidthFull();
        botonLayout.setHeightFull();
        botonLayout.add(btnGuardar, vFirmaCuest);
        VerticalLayout totalesLayout = new VerticalLayout(puntos, descuento, txtAgua, txtDrena, txtTrata);

        contenedor1.add(columnaCriterio, columnaRangos, columnaPuntos);
        contenedor2.add(colunaCriterioEnf, colunaRangoEnf, colunaPuntosEnf);
        contenedor3.add(columnaCriteriosDepen, columnaRangosDepen, columnaPuntosDepen);
        contenedor4.add(columnaCriteriosSalud, columnaRangosSalud, columnaPuntosSalud);
        contenedor5.add(columnaCriteriosZona, columnaRangosZona, columnaPuntosZona);
        contenedor6.add(columnaCriteriosEscolar, columnaRangosEscolar, columnaPuntosEscolar);
        contenedor7.add(columnaCriteriosEdad, columnaRangosEdad, columnaPuntosEdad);
        resultadosLayout.add(botonLayout, etiquetaLayout, totalesLayout);
        formLayout.add(contenedor1,
                contenedor2,
                contenedor3,
                contenedor4,
                contenedor5,
                contenedor6,
                contenedor7,
                resultadosLayout);

        this.add(formLayout);
    }

    Runnable actualizarVisibilidad = () -> {
        boolean todosSelccionados = allRadioButtonsSelected();
        btnGuardar.setVisible(todosSelccionados);
        vFirmaCuest.setVisible(todosSelccionados);
    };
}
