package mx.gob.jumapacelaya.ui;

import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.checkbox.CheckboxGroup;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.Span;
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.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.component.button.Button;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import jakarta.annotation.security.PermitAll;
import mx.gob.jumapacelaya.services.DatabaseService;

import java.awt.*;
import java.time.LocalDate;
import java.util.List;


@PermitAll
@PageTitle("Mantenimiento")
@Route(value = "mantenimiento", layout = MainLayout.class)
@CssImport("./themes/sistema-mantenimiento/styles.css")
public class MantenimientoView extends VerticalLayout {

    private final VerticalLayout controlsLayout;
    private final DatabaseService databaseService;
    private final VerticalLayout actualizacionesLayout;

    public MantenimientoView() {
        this.databaseService = new DatabaseService();
        this.controlsLayout = new VerticalLayout();
        this.actualizacionesLayout = new VerticalLayout();

        HorizontalLayout fechaLayout = new HorizontalLayout();
        //Componentes de texto
        TextField nomenclatura = new TextField("Nomenclatura");
        nomenclatura.setReadOnly(true);
        nomenclatura.addClassName("mantenimiento-text-field");

        TextArea otras = new TextArea("¿Cuales?");
        otras.setEnabled(false);
        otras.addClassName("mantenimiento-text-field");

        //Selector de fecha
        DatePicker fecha = new DatePicker("Fecha");


        //ComboBox Tipo de Mantenimiento
        ComboBox<String> tipoMantt = new ComboBox<>("Tipo de Mantenimiento");
        List<String> tiposDeMantenimiento = databaseService.getTiposDeMantenimientos();
        tipoMantt.setItems(tiposDeMantenimiento);
        tipoMantt.addClassName("mantenimiento-combo");
        tipoMantt.addValueChangeListener(event -> {
            String tipoSeleccionado = event.getValue();
            if (tipoSeleccionado != null) {
                //Actualizar nomenclatura dependiendo al tipo de mantenimiento
                String nomenclaturaValue = databaseService.getNomenclatura(tipoSeleccionado);
                nomenclatura.setValue(nomenclaturaValue);

                //Si el tipo es preventivo se establecera la fecha automaticamente a la fecha del sistema
                if ("PREVENTIVO".equals(tipoSeleccionado)) {
                    fecha.setValue(LocalDate.now());
                } else {
                    fecha.clear();
                }
            } else {
                nomenclatura.clear();
                fecha.clear();
            }
        });
        fechaLayout.add(fecha);
        fechaLayout.addAndExpand(new HorizontalLayout());
        fechaLayout.add(tipoMantt, nomenclatura);
        fechaLayout.setWidthFull();


        HorizontalLayout departamentoLayout = new HorizontalLayout();
        //ComboBox Area o Departamento
        ComboBox<String> area = new ComboBox<>("Area o Departamento");
        List<String> areas = databaseService.getDepartamentos();
        area.setItems(areas);

        ComboBox<String> usuario = new ComboBox<>("Usuario");
        List<String> usuarios = databaseService.getUsuarios();
        usuario.setItems(usuarios);

        departamentoLayout.add(area, usuario);
        departamentoLayout.setWidthFull();

        createHardwareSection(databaseService);
        addActualizacionesSection();


        add(fechaLayout, departamentoLayout, controlsLayout, actualizacionesLayout);
    }


    private void createHardwareSection(DatabaseService databaseService) {
        HorizontalLayout etiquetaLayout = new HorizontalLayout();
        Span etiqueta = new Span("Limpieza de Equipo Realizada");

        //Boton para agregar otro tipo de hardware
        Button btnAgregarTipo = new Button(new Icon(VaadinIcon.PLUS));
        btnAgregarTipo.addThemeVariants(ButtonVariant.LUMO_ICON);
        btnAgregarTipo.setAriaLabel("Agregar Tipo");

        //Listener del boton para agregar mas
        btnAgregarTipo.addClickListener(event -> {
            addNuevoTipo();
        });

        etiquetaLayout.add(etiqueta, btnAgregarTipo);
        controlsLayout.add(etiquetaLayout);
        controlsLayout.setSpacing(false);

        addNuevoTipo();
    }

    //Metodo para agregar un nuevo ComboBox de tipo de hardware y campos de texto
    private void addNuevoTipo() {
        ComboBox<String> tipoHardware = new ComboBox<>();
        List<String> tiposHardware = databaseService.getTiposHardware();
        tipoHardware.setItems(tiposHardware);
        tipoHardware.setPlaceholder("Tipo de hardware");
        tipoHardware.setSizeFull();

        TextField noSerie = new TextField();
        noSerie.setEnabled(false);
        noSerie.setRequired(true);
        noSerie.setPlaceholder("No. Serie");
        noSerie.setSizeFull();

        TextField modelo = new TextField();
        modelo.setEnabled(false);
        modelo.setRequired(true);
        modelo.setPlaceholder("Modelo");
        modelo.setSizeFull();

        TextField placa = new TextField();
        placa.setEnabled(false);
        placa.setRequired(true);
        placa.setPlaceholder("Placa");
        placa.setSizeFull();

        tipoHardware.addValueChangeListener(event -> {
            String tipoSeleccionado = event.getValue();

            if (tipoSeleccionado != null) {
                if ("MOUSE".equalsIgnoreCase(tipoSeleccionado) || "TECLADO".equalsIgnoreCase(tipoSeleccionado)) {
                    noSerie.setEnabled(false);
                    modelo.setEnabled(false);
                    placa.setEnabled(false);
                } else {
                    noSerie.setEnabled(true);
                    modelo.setEnabled(true);
                    placa.setEnabled(true);
                }
            } else {
                noSerie.setEnabled(false);
                modelo.setEnabled(false);
                placa.setEnabled(false);
            }
        });


        //Boton para eliminar ese conjunto de hardware
        Button btnEliminar = new Button(new Icon(VaadinIcon.TRASH));
        btnEliminar.addThemeVariants(ButtonVariant.LUMO_ICON, ButtonVariant.LUMO_ERROR);
        btnEliminar.setAriaLabel("Eliminar Tipo");

        //Crear nuevo layout horizontal con estos campos
        HorizontalLayout hardwareDetailsLayout = new HorizontalLayout();
        hardwareDetailsLayout.add(tipoHardware, noSerie, modelo, placa, btnEliminar);
        hardwareDetailsLayout.setWidthFull();


        //Listener para eliminar el tipo
        btnEliminar.addClickListener(event -> {
            controlsLayout.remove(hardwareDetailsLayout);
        });


        controlsLayout.add(hardwareDetailsLayout);
        controlsLayout.setSizeFull();
    }


    private void addActualizacionesSection() {
        VerticalLayout etiquetaLayout = new VerticalLayout();
        Span Titulo = new Span("Actualizaciones de Seguridad Informatica:");
        etiquetaLayout.add(Titulo);

        CheckboxGroup<String> actualizaciones = new CheckboxGroup<>();
        actualizaciones.setLabel("Actualizaciones Necesarias");
        actualizaciones.setItems("S.O", "Antivirus", "Firewall");

        RadioButtonGroup<String> formaGroup = new RadioButtonGroup<>();
        formaGroup.setRequired(true);
        formaGroup.setLabel("Actividad Realizada de Forma:");
        formaGroup.setItems("Remota", "Manual");

        TextArea txtCuales = new TextArea();
        txtCuales.setLabel("¿Cuales?");
        txtCuales.setEnabled(false);
        txtCuales.setWidthFull();

        RadioButtonGroup<String> masActualizacionesGroup = new RadioButtonGroup<>();
        masActualizacionesGroup.setRequired(true);
        masActualizacionesGroup.setLabel("¿Requiere Más Actualizaciones?");
        masActualizacionesGroup.setItems("Si","No");
        masActualizacionesGroup.addValueChangeListener(event -> {
            if ("Si".equals(event.getValue())) {
                txtCuales.setEnabled(true);
            } else {
                txtCuales.setEnabled(false);
            }
        });


        /*VerticalLayout actualizacionesGroup = new VerticalLayout();
        actualizacionesGroup.add(actualizaciones);*/


        HorizontalLayout formasLayout = new HorizontalLayout();
        formasLayout.add(formaGroup, masActualizacionesGroup, txtCuales);
        formasLayout.setSizeFull();


        actualizacionesLayout.add(Titulo, actualizaciones, formasLayout);
        actualizacionesLayout.setSpacing(false);
    }
}
