package mx.gob.jumapacelaya.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.component.radiobutton.RadioButtonGroup;
import com.vaadin.flow.component.textfield.TextArea;
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 com.vaadin.flow.server.auth.AnonymousAllowed;
import mx.gob.jumapacelaya.models.encuestas.Pregunta;
import mx.gob.jumapacelaya.models.encuestas.Respuesta;
import mx.gob.jumapacelaya.services.DatabaseService;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

@Route("encuesta")
@PageTitle("Encuesta de satisfacción")
@AnonymousAllowed
public class EncuestaView extends VerticalLayout implements BeforeEnterObserver {

    private final DatabaseService encuestasDBService;
    private int mantenimientoId = -1;
    private final VerticalLayout mainLyt = new VerticalLayout();
    private final Button btnEnviar = new Button("Enviar");
    private final TextField txtNumEmpl = new TextField("No. Empleado:");
    private String token;
    private final TextArea txtComentarios = new TextArea("Comentarios:");


    private static class RespuestaComponente {
        Pregunta pregunta;
        RadioButtonGroup<String> radios;

        RespuestaComponente(Pregunta pregunta, RadioButtonGroup<String> radios) {
            this.pregunta = pregunta;
            this.radios = radios;
        }
    }

    private final List<RespuestaComponente> respuestasUI = new ArrayList<>();

    public EncuestaView(DatabaseService encuestasDBService) {
        this.encuestasDBService = encuestasDBService;

        setSpacing(true);
        setPadding(true);

        this.getStyle()
                .set("background-image", "url('/images/LOGO_1024X768.jpg')")
                .set("background-repeat", "no-repeat")
                .set("background-size", "cover")
                .set("background-position", "center");



        mainLyt.setWidth("55%");
        //mainLyt.setMaxHeight("90vh");
        mainLyt.getStyle()
                .set("overflow-y", "auto")
                .set("box-shadow", "0 4px 8px rgba(0,0,0,0.2)")
                .set("border-radius", "12px")
                .set("background-color", "white")
                .set("padding", "1rem")
                .set("margin", "1rem auto");

        btnEnviar.addClickListener(e -> procesarRespuestas());

        this.add(mainLyt);
    }

    private void mostrarMensaje() {

        txtNumEmpl.setRequired(true);
        txtNumEmpl.setErrorMessage("Por favor, llena este campo");

        VerticalLayout titulos = new VerticalLayout();
        titulos.setSpacing(false);
        titulos.setPadding(false);
        titulos.add(
                 new H2("Mantenimiento Preventivo a Equipo de Computo"),
                 new Paragraph("La siguiente encuesta tiene como objetivo valorar el servicio que se brinda al proporcionar el mantenimiento preventivo del equipo de computo en el Organismo."),
                txtNumEmpl
        );

        VerticalLayout preguntasLyt = new VerticalLayout();
        preguntasLyt.setWidthFull();
        preguntasLyt.setPadding(false);
        preguntasLyt.setSpacing(false);

        List<Pregunta> preguntas = encuestasDBService.getPreguntas();

        for (Pregunta p : preguntas) {
            HorizontalLayout fila = new HorizontalLayout();
            fila.setWidthFull();
            fila.setAlignItems(Alignment.CENTER);
            fila.getStyle().set("padding", "0.4rem");
            fila.getStyle().set("border-bottom", "1px solid #e0e0e0");

            Span texto = new Span(p.getPregunta());
            texto.getStyle().set("font-weight", "600");

            RadioButtonGroup<String> radios = new RadioButtonGroup<>();
            radios.setItems("Si", "No");

            fila.add(texto,radios);
            preguntasLyt.add(fila);

            respuestasUI.add(new RespuestaComponente(p,radios));
        }

        txtComentarios.setWidthFull();
        txtComentarios.setMaxHeight("5rem");
        preguntasLyt.add(txtComentarios);

        HorizontalLayout gracias = new HorizontalLayout(new H3("¡Gracias!"));
        gracias.setWidthFull();
        gracias.setJustifyContentMode(JustifyContentMode.CENTER);

        btnEnviar.setWidthFull();
        btnEnviar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        HorizontalLayout btnEnviarLyt = new HorizontalLayout(btnEnviar);
        btnEnviarLyt.setWidthFull();
        btnEnviarLyt.setJustifyContentMode(JustifyContentMode.CENTER);
        btnEnviarLyt.setSpacing(false);
        btnEnviarLyt.setPadding(false);


        mainLyt.removeAll();
        mainLyt.add(titulos,preguntasLyt ,gracias, btnEnviarLyt);
    }

    private void procesarRespuestas() {

        if (txtNumEmpl.isEmpty()) {
            txtNumEmpl.setInvalid(true);
            return;
        }

        int empleadoId = Integer.parseInt(txtNumEmpl.getValue());
        Timestamp ahora = new Timestamp(System.currentTimeMillis());
        List<Respuesta> respuestas = new ArrayList<>();

        for (RespuestaComponente rc : respuestasUI) {
            if (rc.radios.getValue() == null) continue;

            respuestas.add(new Respuesta(
                    rc.pregunta.getPreguntaId(),
                    rc.radios.getValue().equals("Si")
            ));
        }
        txtComentarios.getValue();
        String comentarios = txtComentarios.isEmpty() ? null : txtComentarios.getValue();


        encuestasDBService.insertRespuestas(
                mantenimientoId,
                respuestas,
                empleadoId,
                comentarios,
                this.token
        );

        NotiEncuesta();
        mainLyt.setVisible(false);

        this.setEnabled(false);
    }

    private void NotiEncuesta() {
        Notification ntf = new Notification();
        ntf.setPosition(Notification.Position.MIDDLE);
        ntf.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
        ntf.setDuration(0);

        H2 titulo = new H2("Encuesta enviada");
        titulo.getStyle().set("color","white");
        Span msj = new Span("Sus respuestas se han guardado correctamente.");
        Span msj2 = new Span("Gracias por participar en nuestra encuesta.");

        Icon succesIcon = new Icon(VaadinIcon.CHECK_CIRCLE);
        succesIcon.setSize("48px");

        VerticalLayout layout = new VerticalLayout(succesIcon,titulo,msj,msj2);
        layout.setAlignItems(Alignment.CENTER);

        ntf.add(layout);
        ntf.open();
    }


    @Override
    public void beforeEnter(BeforeEnterEvent beforeEnterEvent) {
        String token = beforeEnterEvent.getLocation().getQueryParameters()
                .getParameters().getOrDefault("token", List.of("")).get(0);

        if (!token.isEmpty()) {
            Integer idRecuperado = encuestasDBService.validarTokenYObtenerId(token);

            if (idRecuperado != null) {
                this.mantenimientoId = idRecuperado;
                this.token = token;
                mostrarMensaje();

            } else {
                mainLyt.add(new H2("El enlace ha expírado o ya fue utilizado."));
                mainLyt.setAlignItems(Alignment.CENTER);
            }
        } else {
            mainLyt.add(new H2("Acceso no autorizado."));
            mainLyt.setAlignItems(Alignment.CENTER);
        }
    }
}
