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.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.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 java.time.LocalDate;
import java.time.format.DateTimeFormatter;

@PageTitle("Descuento Especial")
@Route(value = "descesp", layout = MainLayout.class)
public class DescEspView extends VerticalLayout implements BeforeEnterObserver {

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


    public DescEspView(PredioService predioService, GuardarSolicitudService guardarSolicitudService) {
        this.guardarSolicitudService = guardarSolicitudService;
        this.predioService = predioService;

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

        // Verificar que los datos estén disponibles
        if (predio == null || tipoSolicitud == null || nombreSolicitante == null) {
            Notification.show("Faltan datos importantes. Por favor ingresa la solicitud nuevamente.", 3000, Notification.Position.MIDDLE);
            UI.getCurrent().navigate("solidesc");
        } else {
            cabezera();
            titulo();
            body();
            sign();
        }

        // Guardar la solicitud cuando el usuario firme
        Button btnGuardarSolicitud = new Button("Realizar Cuestionario");
        btnGuardarSolicitud.addClickListener(event -> {

            //notificacion("Solicitud guardada con exito!!");
            UI.getCurrent().navigate("cuestionario");
        });

        this.add(btnGuardarSolicitud);
    }

    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() {

        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 valore mi condición socioeconómica, " +
                        "ya que por el momento no cuento con la solvencia económica suficiente para pagar la tarifa del " +
                        "presente año que corresponde al domicilio que habito ubicado en: " + predio.getDirecmostrar()
        );


        Paragraph parrafo2 = new Paragraph();
        parrafo2.setText(
                "Lo anterior para que se me pueda otorgar un descuento en mi tarifa, comprometiéndome con ello, " +
                        " a mantener mi cuenta regularizada con este Organismo Operador y que no rebasaré un consumo máximo de 15 m3 mensuales; " +
                        "aceptando que no podré solicitar un beneficio o descuento adicional a mi tarifa."
        );

        Paragraph parrafo3 = new Paragraph();
        parrafo3.setText(
                "Sin más por el momento y agradeciendo de antemano sus atenciones, quedo al pendiente " +
                        "de su respuesta."
        );


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


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


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


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

    private void notificacion(String message) {
        Notification notification = new Notification();
        notification.setPosition(Notification.Position.TOP_CENTER);
        notification.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
        notification.setDuration(3000);

        Icon warningIcon = new Icon(VaadinIcon.CHECK_CIRCLE_O);
        warningIcon.setSize("48px");
        warningIcon.getStyle().set("margin-bottom", "10px");


        Paragraph messajeTexto = new Paragraph(message);
        messajeTexto.getStyle().set("margin", "0").set("text-align", "center");


        HorizontalLayout buttonsLayout = new HorizontalLayout(warningIcon, messajeTexto);
        buttonsLayout.setAlignItems(Alignment.CENTER);
        buttonsLayout.setSpacing(false);
        buttonsLayout.setPadding(false);
        buttonsLayout.setWidthFull();

        HorizontalLayout wrapper = new HorizontalLayout(buttonsLayout);
        wrapper.setPadding(true);
        wrapper.setSpacing(false);
        wrapper.getStyle().set("position", "relative");
        wrapper.getStyle().set("padding", "10px");
        wrapper.setWidth("100%");


        notification.add(wrapper);
        notification.open();
    }


    @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");
        }
    }
}
