package mx.gob.jumapacelaya.views.tiposSolicitud;

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.*;
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.router.BeforeEnterEvent;
import com.vaadin.flow.router.BeforeEnterObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import de.f0rce.signaturepad.SignaturePad;
import mx.gob.jumapacelaya.Services.GuardarSolicitudService;
import mx.gob.jumapacelaya.Services.PredioService;
import mx.gob.jumapacelaya.models.Predio;
import mx.gob.jumapacelaya.views.MainLayout;
import org.springframework.beans.factory.annotation.Autowired;

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

@PageTitle("Recargos")
@Route(value = "recargos", layout = MainLayout.class)
public class RecargosView extends VerticalLayout implements BeforeEnterObserver {

    private final PredioService predioService;
    private final GuardarSolicitudService guardarSolicitudService;
    private Predio predio;
    Span nombreCliente = new Span();

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

        this.predio = (Predio) UI.getCurrent().getSession().getAttribute("predio");

        if (predio == null) {
            Notification.show("No se encontró el predio en la sesion. Por favor ingresa un numero de predio primero. Redirigiendo a la vista anterior, espere...", 5000, Notification.Position.MIDDLE);
            UI.getCurrent().navigate("solidesc");
        } else {

            cabezera();
            titulo();
            body();
            sign();
            boton();
        }
    }

    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("Firma Solicitud");

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

    private void titulo() {

        VerticalLayout tituloLayout = new VerticalLayout();

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

        H3 lblSubtitulo = new H3();
        lblSubtitulo.setText("A QUIEN CORRESPONDA");


        tituloLayout.add(lblTitulo, lblSubtitulo);

        this.add(tituloLayout);
    }


    private void body() {
        VerticalLayout bodyLayout = new VerticalLayout();

        H4 lblPresente = new H4();
        lblPresente.setText("PRESENTE:");

        H4 lblAtt = new H4();
        lblAtt.setText("ATENTAMENTE:");

        Paragraph parrafo1 = new Paragraph();
        parrafo1.setText(
                "Sirva este medio para solicitar de la manera más atenta, se me pueda otorgar facilidades para regularizar " +
                        "la cuenta del predio: " + predio.getPredioid() + ", ubicado en: " + predio.getDirecmostrar() + ", a nombre de " + predio.getNomcliente() +
                        ", realizando alguna " +
                        "consideracion al adeudo para poder pagarlo de acuerdo a mis posibilidades económicas."
        );

        bodyLayout.add(lblPresente, parrafo1, lblAtt);
        this.add(bodyLayout);
    }


    private void sign() {
        VerticalLayout signLayout = new VerticalLayout();
        SignaturePad userPad = new SignaturePad();
        //userPad.setBackgroundColor("#FFFFFF");
        userPad.setHeight("200px");
        userPad.setPenColor("#000000");
        userPad.getElement().getStyle().set("border", "1px solid black");


        Span predioCliente = new Span("Predio: " + predio.getPredioid());
        Span contratoCliente = new Span("Contrato: " + predio.getContrato());


        signLayout.add(userPad, nombreCliente, predioCliente, contratoCliente);
        signLayout.setSpacing(false);
        signLayout.setAlignItems(Alignment.CENTER);
        this.setSpacing(false);
        this.add(signLayout);
    }


    private void boton() {
        VerticalLayout botonLayout = new VerticalLayout();

        Button boton = new Button("Guardar");
        boton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        boton.setSizeFull();

        boton.addClickListener(event -> {
            String usuarioId = (String) UI.getCurrent().getSession().getAttribute("usuario");

            if (usuarioId == null || usuarioId.trim().isEmpty()) {
                Notification.show("Usuario no encontrado en la sesión.", 3000, Notification.Position.MIDDLE);
                return;
            }

            String solicitante = nombreCliente.getText().replace("Nombre del Solicitante: ", "").trim();

            if (predio != null && !solicitante.isEmpty()) {
                try {
                    guardarSolicitudService.guardarSolicitud(
                            predio.getPredioid(),       // predioId
                            "Recargos",                 // tipoSolicitud
                            solicitante,                // nombreSolicitante
                            "",                         // parentesco
                            "",                         // tipoIdentificacion
                            "",                         // numIdentificacion
                            usuarioId,                  // usuarioId
                            "",                         // firma (empty or from session)
                            "",                         // email (empty or from session)
                            "",                       // vigencia (true or false)
                            "",                         // estado (empty or some value)
                            "",                         // detdesc (description)
                            "",                         // firmaUsuario (empty or from session)
                            ""
                    );

                    Notification.show("Solicitud guardada exitosamente", 3000, Notification.Position.MIDDLE);
                    UI.getCurrent().navigate("solidesc");
                } catch (Exception e) {
                    e.printStackTrace();
                    Notification.show("Error al guardar la solicitud: " + e.getMessage(), 5000, Notification.Position.MIDDLE);
                }
            } else {
                Notification.show("Faltan datos obligatorios.", 3000, Notification.Position.MIDDLE);
            }
        });


        botonLayout.add(boton);
        this.add(botonLayout);
    }

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

        if (solicitante != null && !solicitante.isEmpty()) {
            nombreCliente.setText("Nombre del Solicitante: " + solicitante);

        } else {
            nombreCliente.setText("Sin solicitante");
        }
    }
}
