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.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.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 org.aspectj.weaver.ast.Not;

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

@PageTitle("Verificacion")
@Route(value = "verificacion", layout = MainLayout.class)
public class VerificacionView extends VerticalLayout implements BeforeEnterObserver {

    private H3 label;
    private final PredioService predioService;

    public VerificacionView(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("Prepara la solicitud:");


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

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


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



        Button btnVerSolicitud = new Button("Ver Solic. Verificación");
        btnVerSolicitud.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        btnVerSolicitud.addThemeVariants(ButtonVariant.LUMO_LARGE);

        btnVerSolicitud.addClickListener(event -> {
            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);
                    UI.getCurrent().getSession().setAttribute("predio", resultado);


                    System.out.println(resultado.getPredioid());
                    System.out.println(resultado.getNomcliente());
                    System.out.println(resultado.getDireccorta());
                    System.out.println(resultado.getTelefono());
                    System.out.println(resultado.getUso());
                    System.out.println(resultado.getActividad());
                    System.out.println(resultado.getContrato());

                    if (nombreSolicitante != null && !nombreSolicitante.isEmpty()) {
                        UI.getCurrent().navigate("verifirma?solicitante=" + nombreSolicitante);

                    } else {
                        Notification.show("Por favor, ingresa el nombre del solicitante.", 3000, Notification.Position.MIDDLE);
                    }

                } else {
                    Notification.show("No se encontró información del predio: " + predioTxT.getValue(), 3000, Notification.Position.MIDDLE);
                }
            } else {
                Notification.show("Por favor, ingresa un numero de predio.", 3000, Notification.Position.MIDDLE);
            }
        });


        formularioLayout.add(label, labelTexto,
                predioTxT,
                solicitante,
                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("/");
        }
    }
}
