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;
import java.util.Base64;

@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;
    H2 presolicitud = new H2();


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

        if(predio.getTarifaid()!=101 && predio.getTarifaid()!=108 && predio.getTarifaid()!=131)
        {
            notifiError("No debemos aplicar descuento con esta tarifa ["+predio.getTarifaid()+"-"+predio.getTarifa()+"]");
            presolicitud.setText("No debemos aplicar descuento con esta tarifa ["+predio.getTarifaid()+"-"+predio.getTarifa()+"]");
            presolicitud.getStyle().set("color", "red");
        }
        else
        {
            presolicitud.setText("PreSolicitud");
            presolicitud.getStyle().set("color", "black");
            presolicitud.getStyle().set("border", "1px solid #ccc");
            presolicitud.getStyle().set("border-radius", "8px");
            presolicitud.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
            presolicitud.getStyle().set("background-color", "#fff");
        }

        // 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 -> {

            // Captura la firma en Base64
            byte[] userPadDescBytes = userPadDesc.getImageBase64();
            String userPadDescBase64 = Base64.getEncoder().encodeToString(userPadDescBytes); // Convierte los byte[] a String en formato Base64

            //Guardamos en la sesion el String de la firma en Base64
            UI.getCurrent().getSession().setAttribute("firma", userPadDescBase64);


            //notificacion("Solicitud guardada con exito!!");
            System.out.println(userPadDescBase64);
            UI.getCurrent().navigate("cuestionario");
        });
        btnGuardarSolicitud.getStyle().set("border", "1px solid #ccc");
        btnGuardarSolicitud.getStyle().set("border-radius", "8px");
        btnGuardarSolicitud.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
        btnGuardarSolicitud.getStyle().set("background-color", "#fff");
        btnGuardarSolicitud.addThemeVariants(ButtonVariant.LUMO_SUCCESS);

        this.add(btnGuardarSolicitud);
        this.setAlignItems(Alignment.CENTER);
    }

    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);
        fecha.getStyle().set("border", "1px solid #ccc");
        fecha.getStyle().set("border-radius", "8px");
        fecha.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
        fecha.getStyle().set("background-color", "#fff");

        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");
        lblTitulo.getStyle().set("border", "1px solid #ccc");
        lblTitulo.getStyle().set("border-radius", "8px");
        lblTitulo.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
        lblTitulo.getStyle().set("background-color", "#fff");

        H3 lblSubtitulo = new H3();
        lblSubtitulo.setText("A QUIEN CORRESPONDA");
        lblSubtitulo.getStyle().set("border", "1px solid #ccc");
        lblSubtitulo.getStyle().set("border-radius", "8px");
        lblSubtitulo.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
        lblSubtitulo.getStyle().set("background-color", "#fff");


        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 " +
                        "año 2025 que corresponde al domicilio que habito ubicado en: " + predio.getDirecmostrar()
        );
        parrafo1.getStyle().set("text-align", "justify");


        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."
        );
        parrafo2.getStyle().set("text-align", "justify");

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


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

    private void notifiError(String message) {
        Notification notification = new Notification();
        notification.setPosition(Notification.Position.TOP_CENTER);
        notification.addThemeVariants(NotificationVariant.LUMO_ERROR);
        notification.setDuration(7000);

        Icon warningIcon = new Icon(VaadinIcon.CLOSE_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();
    }
}
