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.combobox.ComboBox;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.html.Paragraph;
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.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.*;

import java.time.LocalDate;
import java.time.format.TextStyle;
import java.util.Locale;

import mx.gob.jumapacelaya.Services.UserService;
import mx.gob.jumapacelaya.models.Usuario;
import org.springframework.beans.factory.annotation.Autowired;
import org.vaadin.lineawesome.LineAwesomeIconUrl;

@PageTitle("Home")
@Route(value = "", layout = MainLayout.class)
@Menu(order = 0, icon = LineAwesomeIconUrl.FILE)
public class HomeView extends VerticalLayout {

    private final UserService userService;
    private Usuario usuarioSeleccionado = null;

    @Autowired
    public HomeView(UserService userService) {

        // Inyecion del servicio UserService
        this.userService = userService;

        // Llamada a los metodos encapsulados
        cabezera();
        formularios();
    }

    
    // Encapsulacion de los componentes de titulos y subtitulos
    private void cabezera() {

        LocalDate sysDate = LocalDate.now(); // Obtiene la fecha del sistema
        // Formateo a la fecha
        String fechaFormat = sysDate.getDayOfWeek().getDisplayName(TextStyle.FULL, new Locale("es")) + " " +
        sysDate.getDayOfMonth() + " de " +
        sysDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("es")) + " " +
        sysDate.getYear();

        // Subtitulo
        VerticalLayout subTitleLayout = new VerticalLayout();
        H3 lblSubTitle = new H3(fechaFormat);
        subTitleLayout.setAlignItems(Alignment.END);
        subTitleLayout.setPadding(false);
        subTitleLayout.setMargin(false);
        subTitleLayout.add(lblSubTitle);

   
        // Titulo Principal
        VerticalLayout titleLayout = new VerticalLayout();
        H1 lblTitle = new H1("App para firma de formatos digitales");
        titleLayout.setAlignItems(Alignment.CENTER);
        titleLayout.setMargin(false);
        titleLayout.add(lblTitle, subTitleLayout);


        this.setSizeFull();
        this.setPadding(false);
        add(titleLayout);
    }



    // Metodo que contiene los formularios
    private void formularios() {

        VerticalLayout menuLayout = new VerticalLayout();
        menuLayout.setSizeFull();


        ComboBox<Usuario> cmbUsuario = new ComboBox<>("Selecciona tu usuario");
        cmbUsuario.setWidth("20em");
        cmbUsuario.setItems(userService.getUsusarios()); // Llenar el combo con los usuarios
        cmbUsuario.setItemLabelGenerator(Usuario::getNombre);

        cmbUsuario.addValueChangeListener(event -> usuarioSeleccionado = event.getValue());


        String[][] opciones = {
                {"Solicitud de descuento", "solidesc"},
                {"Recibo digital por email", "recibodigital"},
                {"Verificación", "verificacion"},
                {"PGO y Tomas independientes", "pgotomasindep"}
        };


        HorizontalLayout cardLayout = new HorizontalLayout();
        cardLayout.setWidthFull();
        cardLayout.setSpacing(true);
        cardLayout.getStyle().set("flex-wrap", "wrap");
        cardLayout.getStyle().set("justify-content", "center");



        for(String[] opcion : opciones) {
            VerticalLayout card = createCard(opcion[0], opcion[1]);
            cardLayout.add(card);
        }

        menuLayout.add(cmbUsuario, cardLayout);
        add(menuLayout);
        menuLayout.setAlignItems(Alignment.CENTER);
    }


    private VerticalLayout createCard(String title, String route) {
        VerticalLayout card = new VerticalLayout();
        card.setWidth("250px");
        card.setSpacing(false);
        card.setPadding(true);
        card.setAlignItems(Alignment.CENTER);
        card.getStyle().set("border", "1px solid #ccc");
        card.getStyle().set("border-radius", "8px");
        card.getStyle().set("box-shadow", "0 4px 8px rgba(0, 0, 0, 0.1)");
        card.getStyle().set("background-color", "#fff");
        card.getStyle().set("margin", "10px");

        H3 cardTitle = new H3(title);
        Paragraph description = new Paragraph("");
        card.addClickListener(event -> {
            if (usuarioSeleccionado != null) {
                String username = usuarioSeleccionado.getUsuarioId();
                UI.getCurrent().navigate(route + "?usuarioid=" + username);

            } else {
                notificacion("Por favor, selecciona un usuario primero.");
            }
        });

        card.add(cardTitle, description);
        return card;
    }

    private void notificacion(String message) {
        Notification notification = new Notification();
        notification.setPosition(Notification.Position.MIDDLE);
        notification.addThemeVariants(NotificationVariant.LUMO_WARNING);
        notification.setDuration(0);

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


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

        Button closeButton = new Button("OK", event -> notification.close());
        closeButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE);
        closeButton.getElement().setAttribute("arial-label", "Cerrar");

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

        VerticalLayout wrapper = new VerticalLayout(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();
    }
}
