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.H1;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.html.Span;
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.textfield.EmailField;
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.PredioService;
import mx.gob.jumapacelaya.models.Predio;

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

@PageTitle("Solicitud de Recibo Digital")
@Route(value = "recibodigital", layout = MainLayout.class)
public class ReciboDgtalView extends VerticalLayout implements BeforeEnterObserver {

    private H3 label;
    private final PredioService predioService;

    public ReciboDgtalView(PredioService predioService) {
        this.predioService = predioService;

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



        NumberField predioTxt = new NumberField("Predio:");
        predioTxt.setRequired(true);

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

        EmailField emailField = new EmailField("Email:");
        emailField.setRequired(true);
        emailField.setWidth("30em");


        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 prof.", "Visa", "Otro...");

        TextField numIdentificacion = new TextField();
        numIdentificacion.setPlaceholder("No. identificacion");
        numIdentificacion.setWidthFull();

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

        btnVerSolicitud.addClickListener(event -> {
            String nombreSolicitante = solicitante.getValue();
            String emailCliente = emailField.getValue();

            // Validar si el campo de número de predio tiene valor
            if (predioTxt.getValue() == null) {
                Notification.show("Por favor, ingresa un número de predio.", 3000, Notification.Position.MIDDLE);
                return;
            }

            // Validar si el campo de solicitante está vacío
            if (nombreSolicitante == null || nombreSolicitante.isEmpty()) {
                Notification.show("Por favor, ingresa el nombre del solicitante.", 3000, Notification.Position.MIDDLE);
                return;
            }

            // Validar si el campo de correo electrónico está vacío
            if (emailCliente == null || emailCliente.isEmpty()) {
                Notification.show("Por favor, ingresa el email del solicitante.", 3000, Notification.Position.MIDDLE);
                return;
            }

            // Validar si el correo electrónico tiene un formato válido (opcional)
            if (!emailCliente.contains("@") || !emailCliente.contains(".")) {
                Notification.show("Por favor, ingresa un email válido.", 3000, Notification.Position.MIDDLE);
                return;
            }

            // Obtener el valor de predioTxt y convertirlo a int
            int predioId = predioTxt.getValue().intValue();

            // Consultar el predio
            List<Predio> predios = predioService.getInfoPredio(predioId);

            if (predios.isEmpty()) {
                Notification.show("No se encontró información del predio", 3000, Notification.Position.MIDDLE);
                return;
            }


            Predio resultado = predios.get(0);
            UI.getCurrent().getSession().setAttribute("predio", resultado);

            // Navegar a la siguiente vista con los parámetros
            UI.getCurrent().navigate("recibo?solicitante=" + nombreSolicitante + "&email=" + emailCliente);
        });


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


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

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