package mx.gob.jumapacelaya.ui;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.List;
import org.springframework.security.core.Authentication;
import org.springframework.cglib.core.Local;
import org.springframework.security.core.context.SecurityContextHolder;
import org.vaadin.lineawesome.LineAwesomeIcon;
import com.nimbusds.jose.proc.SecurityContext;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.confirmdialog.ConfirmDialog;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.gridpro.GridPro;
import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.html.Image;
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.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.function.ValueProvider;
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 jakarta.annotation.security.PermitAll;
import mx.gob.jumapacelaya.models.ActualizacioneSeguridadModel;
import mx.gob.jumapacelaya.models.DepartamentosModel;
import mx.gob.jumapacelaya.models.DetalleMantenimientoModel;
import mx.gob.jumapacelaya.models.HardwareDetalle;
import mx.gob.jumapacelaya.models.TiposMantenimiento;
import mx.gob.jumapacelaya.models.Usuario;
import mx.gob.jumapacelaya.services.DatabaseService;
import mx.gob.jumapacelaya.services.SecurityService;
import oracle.net.aso.f;

@PageTitle("Detalles del mantenimiento")
@Route(value = "detalles", layout = MainLayout.class)
@PermitAll
@CssImport("./themes/sistema-mantenimiento/styles.css")
public class DetallesMantView extends VerticalLayout implements BeforeEnterObserver {

    private H3 id;
    private VerticalLayout mainLayout;
    private HorizontalLayout headerLayout;
    private HorizontalLayout layout2;
    private HorizontalLayout layout3;
    private HorizontalLayout botonesLayout;
    private HorizontalLayout fechasLayout;
    private TextField txtId;
    private TextField txtEquipo;
    private ComboBox<TiposMantenimiento> cbTipo;
    private TextField txtFecha;
    private TextField txtFechaRealizacion;
    private ComboBox<Usuario> cbUsuario;
    private ComboBox<DepartamentosModel> cbDepartamento;
    private GridPro<HardwareDetalle> gridHardware;
    private GridPro<ActualizacioneSeguridadModel> gridActualizaciones;
    private Button btnEditar;
    private Button btnImprimirRepo;
    private Button btnCancelar;
    private Button btnGuardar;
    private int planAnualIdActual;
    private int mantenimientoIdActual;
    private Dialog confirmDialog;
    private SignaturePad userSignPad;
    private SignaturePad smtSignPad;
    private SignaturePad gciaSignPad;
    private final HorizontalLayout firmasLAyout = new HorizontalLayout();
    private Image firmaUsuarioImg;
    private Image firmaSmtImg;
    private Image firmaGciaImg;

    private VerticalLayout userSignLayout;
    private VerticalLayout smtSignLayout;
    private VerticalLayout gciaSignLayout;

    private final SecurityService securityService;
    private final DatabaseService service;

    public DetallesMantView(SecurityService securityService, DatabaseService service) {
        this.service = service;
        this.securityService = securityService;
        setPadding(true);

        mainLayout = new VerticalLayout();
        mainLayout.setHeightFull();
        mainLayout.getStyle()
            .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");


        id = new H3();

        headerLayout = new HorizontalLayout();
        headerLayout.setWidthFull();
        headerLayout.add(id);

        cbTipo = new ComboBox<>("Tipo:");
        cbTipo.setItems(service.getTiposDeMantenimientos());
        cbTipo.setItemLabelGenerator(TiposMantenimiento::getNombre);

        cbUsuario = new ComboBox<>("Usuario:");
        cbUsuario.setItems(service.getUsuarios());
        cbUsuario.setItemLabelGenerator(Usuario::getNombre);

        cbDepartamento = new ComboBox<>("Area:");
        cbDepartamento.setItems(service.getDepartamentos());
        cbDepartamento.setItemLabelGenerator(DepartamentosModel::getNombre);

        layout2 = new HorizontalLayout();
        layout2.setWidthFull();
        txtEquipo = new TextField("Equipo:");
        txtEquipo.setReadOnly(true);
        cbTipo.setReadOnly(true);
        layout2.add(txtEquipo,cbTipo);


        fechasLayout = new HorizontalLayout();
        fechasLayout.setWidthFull();
        txtFecha = new TextField("Fecha realización:");
        txtFechaRealizacion = new TextField("Fecha programada:");
        txtFecha.setReadOnly(true);
        txtFechaRealizacion.setReadOnly(true);
        fechasLayout.add(txtFechaRealizacion,txtFecha);

        layout3 = new HorizontalLayout();
        layout3.setWidthFull();
        cbUsuario.setReadOnly(true);
        cbDepartamento.setReadOnly(true);
        cbUsuario.setWidthFull();
        cbDepartamento.setWidthFull();
        layout3.add(cbUsuario,cbDepartamento);


        // Grid que muestra los detalles del hardware
        gridHardware = new GridPro<>();
        gridHardware.addColumn(item -> item.getDescripcion())
            .setHeader("Descripción");

        gridHardware.addEditColumn(HardwareDetalle::getNumSerie)
            .text((item, newValue) -> item.setNumSerie(newValue))
            .setHeader("No. Serie")
            .setEditorComponent(new TextField());

        gridHardware.addEditColumn(HardwareDetalle::getModelo)
            .text((item, newValue) -> item.setModelo(newValue))
            .setHeader("Modelo")
            .setEditorComponent(new TextField());

        gridHardware.addEditColumn(HardwareDetalle::getPlaca)
            .text((item, newValue) -> item.setPlaca(newValue))
            .setHeader("Placa")
            .setEditorComponent(new TextField());

        gridHardware.setWidthFull();
        gridHardware.setEditOnClick(false);
        gridHardware.setHeight("250px");
        gridHardware.addThemeVariants(GridVariant.LUMO_ROW_STRIPES);



        // Grid que muestra las actualizaciones de seguridad
        gridActualizaciones = new GridPro<>();
        gridActualizaciones.addEditColumn(ActualizacioneSeguridadModel::getDescripcion)
            .text((item, newValue) -> item.setDescripcion(newValue))
            .setHeader("Descripción")
            .setEditorComponent(new TextField());
        
        gridActualizaciones.addEditColumn(ActualizacioneSeguridadModel::getOtrasactualizaciones)
            .text((item, newValue) -> item.setOtrasactualizaciones(newValue))
            .setHeader("Otras Actualizaciones")
            .setEditorComponent(new TextField());

        gridActualizaciones.setWidthFull();
        gridActualizaciones.setEditOnClick(false);
        gridActualizaciones.setHeight("200px");
        gridActualizaciones.addThemeVariants(GridVariant.LUMO_ROW_STRIPES);



        botonesLayout = new HorizontalLayout();
        botonesLayout.setWidthFull();
        botonesLayout.setJustifyContentMode(JustifyContentMode.CENTER);
        btnEditar = new Button("Editar", new Icon(VaadinIcon.EDIT));
        btnImprimirRepo = new Button("Imprimir Reporte", new Icon(VaadinIcon.PRINT));
        btnGuardar = new Button("Guardar", LineAwesomeIcon.SAVE_SOLID.create());
        btnCancelar = new Button("Cancelar", new Icon(VaadinIcon.CLOSE_CIRCLE_O));
        botonesLayout.add(btnEditar,btnImprimirRepo,btnGuardar,btnCancelar);

        btnGuardar.setVisible(false);
        btnGuardar.getStyle().set("background-color", "#008000");
        btnGuardar.getStyle().set("color", "white");
        btnCancelar.setVisible(false);
        btnCancelar.getStyle().set("background-color", "red");
        btnCancelar.getStyle().set("color", "white");

        btnEditar.addClickListener(e -> {
            txtEquipo.setReadOnly(false);
            cbTipo.setReadOnly(false);
            txtFecha.setReadOnly(false);
            txtFechaRealizacion.setReadOnly(false);
            cbUsuario.setReadOnly(false);
            cbDepartamento.setReadOnly(false);
            btnImprimirRepo.setVisible(false);
            btnEditar.setVisible(false);
            btnGuardar.setVisible(true);
            btnCancelar.setVisible(true);
            gridHardware.setEditOnClick(true);
            gridActualizaciones.setEditOnClick(true);
        });

        btnCancelar.addClickListener(e -> {
            txtEquipo.setReadOnly(true);
            cbTipo.setReadOnly(true);
            txtFecha.setReadOnly(true);
            txtFechaRealizacion.setReadOnly(true);
            cbUsuario.setReadOnly(true);
            cbDepartamento.setReadOnly(true);
            btnImprimirRepo.setVisible(true);
            btnEditar.setVisible(true);
            btnGuardar.setVisible(false);
            btnCancelar.setVisible(false);
            gridHardware.setEditOnClick(false);
            gridHardware.getEditor().cancel();
            gridActualizaciones.setEditOnClick(false);
            gridActualizaciones.getEditor().cancel();

            if (firmaUsuarioImg != null && userSignPad.getParent().isPresent()) {
                userSignLayout.replace(userSignPad, firmaUsuarioImg);
            }
            if (firmaSmtImg != null && smtSignPad.getParent().isPresent()) {
                smtSignLayout.replace(smtSignPad, firmaSmtImg);
            }
        });


        // Se dispara el dialogo de confirmacion
        btnGuardar.addClickListener(e -> confirmDialog.open());


        // Dialogo de confirmación de actualización
        confirmDialog = new Dialog();
        confirmDialog.setHeaderTitle("Actualizar Mantenimiento");

        TextField txtJustificacion = new TextField("Justificacion");
        txtJustificacion.setWidthFull();
        txtJustificacion.setRequired(true);

        confirmDialog.add(
            new VerticalLayout(
                new Span("¿Estás seguro de que deseas actualizar el mantenimiento?"),
                txtJustificacion
            )
        );

        Button btnConfirmar = new Button("Actualizar", event -> {
            String justificacion = txtJustificacion.getValue();
            if (justificacion.isEmpty()) {
                txtJustificacion.setErrorMessage("Por favor, ingresa una justificación.");
                txtJustificacion.setInvalid(true);
                return;
            }
            txtJustificacion.setInvalid(false);
            confirmDialog.close();

            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String usuarioId = authentication != null ? authentication.getName().toUpperCase() : "DESCONOCIDO";

            LocalDate fecha = LocalDate.now();

            service.insertarBitacora(mantenimientoIdActual, usuarioId, fecha, justificacion);

            realizarActualizacion();
            txtJustificacion.clear();
        });

        Button btnCancelarDialog = new Button("Cancelar", event -> {
            confirmDialog.close();
            txtEquipo.setReadOnly(true);
            cbTipo.setReadOnly(true);
            txtFecha.setReadOnly(true);
            txtFechaRealizacion.setReadOnly(true);
            cbUsuario.setReadOnly(true);
            cbDepartamento.setReadOnly(true);
            btnImprimirRepo.setVisible(true);
            btnEditar.setVisible(true);
            btnGuardar.setVisible(false);
            btnCancelar.setVisible(false);
            gridHardware.setEditOnClick(false);
            gridHardware.getEditor().cancel();

            if (firmaUsuarioImg != null && userSignPad.getParent().isPresent()) {
                userSignLayout.replace(userSignPad, firmaUsuarioImg);
            }
            if (firmaSmtImg != null && smtSignPad.getParent().isPresent()) {
                smtSignLayout.replace(smtSignPad, firmaSmtImg);
            }
        });

        HorizontalLayout dialogButtons = new HorizontalLayout(btnConfirmar, btnCancelarDialog);
        confirmDialog.getFooter().add(dialogButtons);


        addSignatureSection();
        mainLayout.add(headerLayout,layout2,fechasLayout,layout3,gridHardware,gridActualizaciones,firmasLAyout,botonesLayout);
        add(mainLayout);
    }


    private void realizarActualizacion() {
        boolean exito = true;

            // Obtén los objetos seleccionados
            TiposMantenimiento tipoSeleccionado = cbTipo.getValue();
            Usuario usuarioSeleccionado = cbUsuario.getValue();
            DepartamentosModel departamentoSeleccionado = cbDepartamento.getValue();

            int tipoId = tipoSeleccionado != null ? Integer.parseInt(tipoSeleccionado.getTipomantId()) : 0;
            int empleadoId = usuarioSeleccionado != null ? Integer.parseInt(usuarioSeleccionado.getEmpleadoId()) : 0;
            String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId() : null;

            // Fechas (corrige el campo)
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            LocalDate fechaProg = !txtFechaRealizacion.getValue().isEmpty() ? LocalDate.parse(txtFechaRealizacion.getValue(), formatter) : null;
            LocalDate fechaRealizado = !txtFecha.getValue().isEmpty() ? LocalDate.parse(txtFecha.getValue(), formatter) : null;


            

            // ACTUALIZA PLANANUAL (nombre del equipo y fecha programada)
            if (!service.actualizarPlanAnual(planAnualIdActual, txtEquipo.getValue(), fechaProg)) {
                exito = false;
            }
            // ACTUALIZA MANTENIMIENTOS (tipo, departamento, usuario, fecha realizado)
            if (!service.actualizarMantenimiento(
                mantenimientoIdActual,
                tipoId,
                departamentoId,
                empleadoId,
                fechaRealizado,
                txtEquipo.getValue()
            )) {
                exito = false;
            }

            // ACTUALIZA HARDWARE (grid)
            for (HardwareDetalle detalle : gridHardware.getListDataView().getItems().toList()) {
                if (!service.actualizarHardwareDetalle(detalle)) {
                    exito = false;
                }
            }

            // ACTUALIZA ACTUALIZACIONES DE SEGURIDAD (grid)
            for (ActualizacioneSeguridadModel actualizacion : gridActualizaciones.getListDataView().getItems().toList()) {
                if (!service.actualizarActualizacionSeg(actualizacion)) {
                    exito = false;
                }
            }

            if (exito) {
                Notification.show("Registros actualizados correctamente", 3000, Notification.Position.MIDDLE)
                    .addThemeVariants(NotificationVariant.LUMO_SUCCESS);
            } else {
                Notification.show("Error al actualizar uno o más registros", 3000, Notification.Position.MIDDLE)
                    .addThemeVariants(NotificationVariant.LUMO_ERROR);
            }
            // Opcional: volver a modo solo lectura
            txtEquipo.setReadOnly(true);
            cbTipo.setReadOnly(true);
            txtFecha.setReadOnly(true);
            txtFechaRealizacion.setReadOnly(true);
            cbUsuario.setReadOnly(true);
            cbDepartamento.setReadOnly(true);
            btnImprimirRepo.setVisible(true);
            btnEditar.setVisible(true);
            btnGuardar.setVisible(false);
            btnCancelar.setVisible(false);
            gridHardware.setEditOnClick(false);
            gridHardware.getEditor().cancel();
            if (firmaUsuarioImg != null && userSignPad.getParent().isPresent()) {
                userSignLayout.replace(userSignPad, firmaUsuarioImg);
            }
            if (firmaSmtImg != null && smtSignPad.getParent().isPresent()) {
                smtSignLayout.replace(smtSignPad, firmaSmtImg);
            }
    }


    // Metodo para verificar si la firma corresponde a una cadena de firma vacia
    private boolean esFirmaVacia(String firmaBase64) {

        String firmaVacia = "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";
        return firmaBase64.equals(firmaVacia);

    }


    private void addSignatureSection() {
        // Usa los atributos de clase, no variables locales
        userSignLayout = new VerticalLayout();
        userSignLayout.setWidthFull();
        userSignLayout.setAlignItems(Alignment.CENTER);
        userSignPad = new SignaturePad();
        userSignPad.setHeight("200px");
        userSignPad.setWidthFull();
        userSignLayout.add(userSignPad, new Span("Usuario Interno"));

        smtSignLayout = new VerticalLayout();
        smtSignLayout.setWidthFull();
        smtSignLayout.setAlignItems(Alignment.CENTER);
        smtSignPad = new SignaturePad();
        smtSignPad.setHeight("200px");
        smtSignPad.setWidthFull();
        smtSignLayout.add(smtSignPad, new Span("Responsable de Soporte"));

        gciaSignLayout = new VerticalLayout();
        gciaSignLayout.setWidthFull();
        gciaSignLayout.setAlignItems(Alignment.CENTER);
        gciaSignPad = new SignaturePad();
        gciaSignPad.setHeight("200px");
        gciaSignPad.setWidthFull();
        gciaSignLayout.add(gciaSignPad, new Span("Gcia. de T.I"));

        firmasLAyout.removeAll();
        firmasLAyout.setWidthFull();
        firmasLAyout.setSpacing(false);
        firmasLAyout.setJustifyContentMode(JustifyContentMode.CENTER);
        firmasLAyout.add(userSignLayout, smtSignLayout, gciaSignLayout);
    }


    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        String idParam = event.getLocation().getQueryParameters().getParameters().get("id") != null
                ? event.getLocation().getQueryParameters().getParameters().get("id").stream().findFirst().orElse(null)
                : null;

        if (idParam != null) {
            try {
                int planId = Integer.parseInt(idParam);

                DetalleMantenimientoModel detalle = service.getDetalleMantenimientoPorPlanAnualId(planId);

                if (detalle != null) {
                    this.planAnualIdActual = detalle.getPlanAnualId();
                    this.mantenimientoIdActual = detalle.getId();

                    id.setText("Plan ID: " + idParam);
                    txtEquipo.setValue(String.valueOf(detalle.getNombreEquipo()));
                    cbTipo.setValue(
                    cbTipo.getListDataView().getItems()
                        .filter(t -> t.getNombre().equals(detalle.getTipo()))
                        .findFirst().orElse(null)
                    );

                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
                    String fechaProg = detalle.getFechaprog() != null ? detalle.getFechaprog().format(formatter) : "";
                    String fechaReal = detalle.getFecha() != null ? detalle.getFecha().format(formatter) : "";

                    txtFechaRealizacion.setValue(fechaProg);
                    txtFecha.setValue(fechaReal);
                    cbUsuario.setValue(
                    cbUsuario.getListDataView().getItems()
                        .filter(u -> u.getNombre().equals(detalle.getUsuario()))
                        .findFirst().orElse(null)
                    );
                    cbDepartamento.setValue(
                    cbDepartamento.getListDataView().getItems()
                        .filter(d -> d.getNombre().equals(detalle.getDepartamento()))
                        .findFirst().orElse(null)
                    );
                    int mantId = detalle.getId();
                    List<HardwareDetalle> listaHardware = service.getHardwaredetallePorMantId(mantId);
                    gridHardware.setItems(listaHardware);

                    List<ActualizacioneSeguridadModel> listaActualizaciones = service.getActualizacionesSeg(mantId);
                    gridActualizaciones.setItems(listaActualizaciones);
                    gridActualizaciones.setVisible(!listaActualizaciones.isEmpty());


                    // --- Mostrar firmas como imagen si existen ---
                    // Firma usuario
                    if (detalle.getFirmaUser() != null && !detalle.getFirmaUser().isEmpty()) {
                        String firmaUser = detalle.getFirmaUser();
                        if (!firmaUser.startsWith("data:image")) {
                            firmaUser = "data:image/png;base64," + firmaUser;
                        }
                        firmaUsuarioImg = new Image(firmaUser, "Firma del usuario");
                        firmaUsuarioImg.setHeight("200px");
                        firmaUsuarioImg.setWidthFull();
                        userSignLayout.replace(userSignPad, firmaUsuarioImg);
                    }
                    // Firma soporte
                    if (detalle.getFirmaSmt() != null && !detalle.getFirmaSmt().isEmpty()) {
                        String firmaSmt = detalle.getFirmaSmt();
                        if (!firmaSmt.startsWith("data:image")) {
                            firmaSmt = "data:image/png;base64," + firmaSmt;
                        }
                        firmaSmtImg = new Image(firmaSmt, "Firma del usuario de soporte");
                        firmaSmtImg.setHeight("200px");
                        firmaSmtImg.setWidthFull();
                        smtSignLayout.replace(smtSignPad, firmaSmtImg);
                    }
                    
                    Image firmaGcia = new Image("images/firmaGcia.png", "Firma de la Gcia. de T.I");
                    firmaGcia.setHeight("200px");
                    firmaGcia.setWidthFull();

                    gciaSignLayout.replace(gciaSignPad, firmaGcia);
                } else {
                    id.setText("No se encontro informacion para el Plan ID: " + planId);
                }

            } catch (NumberFormatException e) {
                id.setText("ID no valido");
            }
        }
    }
}