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.checkbox.CheckboxGroup;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.html.*;
import com.vaadin.flow.component.notification.Notification;
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.textfield.NumberField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.BeforeEnterEvent;
import com.vaadin.flow.router.BeforeEnterObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import mx.gob.jumapacelaya.Services.GuardarSolicitudService;
import mx.gob.jumapacelaya.Services.PredioService;
import mx.gob.jumapacelaya.models.Predio;
import mx.gob.jumapacelaya.views.tiposSolicitud.InfraccionesView;
import org.aspectj.weaver.ast.Not;
import org.hibernate.annotations.DialectOverride;
import org.springframework.beans.factory.annotation.Autowired;

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

@PageTitle("Solicitud de Descuento")
@Route(value = "solidesc", layout = MainLayout.class)
public class SolicitudDescView extends VerticalLayout implements BeforeEnterObserver {

    private H3 label;
    private String usuarioId;
    private final PredioService predioService;
    private final GuardarSolicitudService guardarSolicitudService;

    @Autowired
    public SolicitudDescView(PredioService predioService, GuardarSolicitudService guardarSolicitudService) {
        this.setSizeFull();
        this.predioService = predioService;
        this.guardarSolicitudService = guardarSolicitudService;

        cabezera();
        titulo();
        formulario();
    }



    private void cabezera() {

        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);

        H2 presolicitud = new H2();
        presolicitud.setText("PreSolicitud");

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


    private void titulo() {

        HorizontalLayout tituloLayout = new HorizontalLayout();

        H2 lblTitulo = new H2();
        lblTitulo.setText("JUNTA MUNICIPAL DE AGUA POTABLE Y ALCANTARILLADO DE CELAYA, GTO");


        tituloLayout.add(lblTitulo);

        this.add(tituloLayout);
    }


    private void formulario() {
        VerticalLayout formularioLayout = new VerticalLayout();
        //formularioLayout.getStyle().set("background-color", "green");
        formularioLayout.setSpacing(true);
        formularioLayout.setPadding(true);


        label = new H3("Solicitud de Descuento en adeudo [USUARIO]");

        Span labelTexto = new Span();
        labelTexto.setText("Prepara la solicitud:");


        RadioButtonGroup<String> tipoSolicitudGroup = new RadioButtonGroup<>("Elige el tipo de Solicitud:");
        tipoSolicitudGroup.setItems("Recargos", "Infracciones", "Ajuste de Facturas", "Descuento Especial Pago Anual");


        NumberField predioTxt = new NumberField("Predio:");

        TextField solicitante = new TextField("Solicitante:");
        solicitante.setWidth("30em");

        TextField txtParentesco = new TextField("Parentesco:");

        HorizontalLayout identificacionLayout = new HorizontalLayout();
        identificacionLayout.setWidthFull();

        Span identificacionTexto = new Span();
        identificacionTexto.setText("Se identifica con:");

        ComboBox<String> cmbTipoIdentificacion = new ComboBox<>();
        cmbTipoIdentificacion.setPlaceholder("Selecciona una opcion");
        cmbTipoIdentificacion.setItems("INE/IFE", "Lic. de conducir", "Pasaporte", "Cedula profesional", "Visa", "Otro...");

        TextField numIdentificacion = new TextField();
        numIdentificacion.setPlaceholder("No. identificacion");
        numIdentificacion.setWidth("400px");

        Button btnVerSolicitud = new Button("Ver Solicitud");
        btnVerSolicitud.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        btnVerSolicitud.addThemeVariants(ButtonVariant.LUMO_LARGE);

        btnVerSolicitud.addClickListener(event -> {
            String tipoSolicitud = tipoSolicitudGroup.getValue();
            String nombreSolicitante = solicitante.getValue();

            if (predioTxt.getValue() != null) {
                int predioId = predioTxt.getValue().intValue();
                List<Predio> predios = predioService.getInfoPredio(predioId);

                if (!predios.isEmpty()) {
                    Predio resultado = predios.get(0);

                    // Luego de guardar la solicitud, redirigir a la página correspondiente
                    String url = "";
                    String tipoIden = "";

                    switch (tipoSolicitud) {
                        case "Recargos":
                            url = "recargos?solicitante=" + nombreSolicitante;
                            tipoSolicitud = "R";
                            break;
                        case "Infracciones":
                            url = "infracciones?solicitante=" + nombreSolicitante;
                            tipoSolicitud = "I";
                            break;
                        case "Ajuste de Facturas":
                            url = "ajustefacturas?solicitante=" + nombreSolicitante;
                            tipoSolicitud = "A";
                            break;
                        case "Descuento Especial Pago Anual":
                            url = "descesp?solicitante=" + nombreSolicitante;
                            tipoSolicitud = "E";
                            break;
                        default:
                            Notification.show("Selecciona un tipo de solicitud", 3000, Notification.Position.MIDDLE);
                            return; // No continuar si no se seleccionó un tipo válido
                    }

                    switch (cmbTipoIdentificacion.getValue()) {
                        case "INE/IFE":
                            tipoIden="ine";
                            break;
                        case "Lic. de conducir":
                            tipoIden="lcn";
                            break;
                        case "Pasaporte":
                            tipoIden="psp";
                            break;
                        case "Cedula profesional":
                            tipoIden="cpf";
                            break;
                        case "Visa":
                            tipoIden="vsa";
                            break;
                        case "otro":
                            tipoIden="otr";                            
                            break;
                    
                        default:
                            tipoIden="otr"; 
                            break;
                    }

                    UI.getCurrent().getSession().setAttribute("predio", resultado);
                    UI.getCurrent().getSession().setAttribute("tipoSolicitud", tipoSolicitud);
                    UI.getCurrent().getSession().setAttribute("nombreSolicitante", nombreSolicitante);
                    UI.getCurrent().getSession().setAttribute("txtParentesco", txtParentesco.getValue());
                    UI.getCurrent().getSession().setAttribute("cmbTipoIdentificacion", tipoIden);
                    UI.getCurrent().getSession().setAttribute("numIdentificacion", numIdentificacion.getValue());
                    UI.getCurrent().getSession().setAttribute("usuarioId", usuarioId);

                    if (!url.isEmpty()) {
                        UI.getCurrent().navigate(url);
                    }
                } else {
                    Notification.show("No se encontró información del predio", 3000, Notification.Position.MIDDLE);
                }
            } else {
                Notification.show("Ingresa un número de predio", 3000, Notification.Position.MIDDLE);
            }
        });

        identificacionLayout.add(cmbTipoIdentificacion, numIdentificacion);
        formularioLayout.add(label, labelTexto,
                tipoSolicitudGroup, predioTxt,
                solicitante, identificacionTexto,
                identificacionLayout, txtParentesco);
        formularioLayout.setSpacing(false);
        this.add(formularioLayout, btnVerSolicitud);
    }

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        usuarioId = event.getLocation().getQueryParameters().getParameters().get("usuarioid") != null
                ? event.getLocation().getQueryParameters().getParameters().get("usuarioid").stream().findFirst().orElse(null)
                : null;


        if (usuarioId != null) {
            label.setText("Solicitud de Descuento en adeudo [" + usuarioId + "]");
        } else {
            label.setText("Usuario Desconocido");
            UI.getCurrent().navigate("/");
        }
    }
}
