package mx.gob.jumapacelaya.ui;

import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.html.*;
import com.vaadin.flow.component.page.History;
import com.vaadin.flow.server.StreamRegistration;
import com.vaadin.flow.server.StreamResource;
import mx.gob.jumapacelaya.services.EmailService;
import mx.gob.jumapacelaya.services.ReportService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.vaadin.lineawesome.LineAwesomeIcon;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.dialog.Dialog;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.gridpro.GridPro;
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.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;

@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 static final Logger logger = LoggerFactory.getLogger(DetallesMantView.class);

    @Value("${app.base-url}")
    private String baseUrl;

    private final H3 id;
    private final TextField mantId;
    private final EmailService emailService;
    private HorizontalLayout fechasLayout;
    private TextField txtId;
    private final TextField txtEquipo;
    private final ComboBox<TiposMantenimiento> cbTipo;
    private final TextField txtFecha;
    private final TextField txtFechaProgramada;
    private final TextField txtSituacion;
    private final ComboBox<Usuario> cbUsuario;
    private final ComboBox<DepartamentosModel> cbDepartamento;
    private final GridPro<HardwareDetalle> gridHardware;
    private final GridPro<ActualizacioneSeguridadModel> gridActualizaciones;
    private final Button btnEditar;
    private final Button btnEditarFirmas;
    private final Button btnImprimirRepo = new Button("Imprimir Reporte", new Icon(VaadinIcon.PRINT));
    private final Button btnCancelar;
    private final Button btnGuardar;
    private final Button btnEnviarEncuesta = new Button("Enviar encuesta", LineAwesomeIcon.ENVELOPE_SOLID.create());
    private final Button btnVolverAtras = new Button(LineAwesomeIcon.ARROW_LEFT_SOLID.create());
    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;
    Notification avisoEncuestaNtf;

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

    private final DatabaseService service;

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

        VerticalLayout mainLayout = new VerticalLayout();
        mainLayout.setHeightFull();
        mainLayout.getStyle()
                .set("box-shadow","0 4px 8px rgba(0,0,0,0.2)")
                .set("border-radius", "12px")
                .set("padding", "1rem")
                .set("margin", "1rem auto");


        id = new H3();
        mantId = new TextField();

        HorizontalLayout headerLayout = new HorizontalLayout();
        headerLayout.setWidthFull();
        headerLayout.setAlignItems(Alignment.BASELINE);
        headerLayout.add(id, mantId);

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

        HorizontalLayout 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:");
        txtFechaProgramada = new TextField("Fecha programada:");
        txtSituacion = new TextField("Situación:");
        txtFecha.setReadOnly(true);
        txtFechaProgramada.setReadOnly(true);
        txtSituacion.setReadOnly(true);
        fechasLayout.add(txtFechaProgramada,txtFecha,txtSituacion);

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


        History history = UI.getCurrent().getPage().getHistory();
        btnVolverAtras.addClickListener(e -> history.back());
        btnVolverAtras.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE);
        btnVolverAtras.setTooltipText("Volver a la lista de mantenimientos");

        HorizontalLayout botonesHeaderLyt = new HorizontalLayout();
        botonesHeaderLyt.setWidthFull();
        botonesHeaderLyt.add(btnVolverAtras, btnImprimirRepo, btnEnviarEncuesta);

        HorizontalLayout botonesLayout = new HorizontalLayout();
        botonesLayout.setWidthFull();
        botonesLayout.setJustifyContentMode(JustifyContentMode.CENTER);
        btnEditar = new Button("Editar", new Icon(VaadinIcon.EDIT));
        btnEditarFirmas = new Button("Editar firmas", LineAwesomeIcon.SIGNATURE_SOLID.create());
        btnGuardar = new Button("Guardar", LineAwesomeIcon.SAVE_SOLID.create());
        btnCancelar = new Button("Cancelar", new Icon(VaadinIcon.CLOSE_CIRCLE_O));
        botonesLayout.add(btnEditar,btnEditarFirmas,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);
            cbUsuario.setReadOnly(false);
            cbDepartamento.setReadOnly(false);
            btnImprimirRepo.setVisible(false);
            btnEditar.setVisible(false);
            btnGuardar.setVisible(true);
            btnCancelar.setVisible(true);
            btnEditarFirmas.setVisible(false);
            gridHardware.setEditOnClick(true);
            gridActualizaciones.setEditOnClick(true);
        });

        btnEditarFirmas.addClickListener(e -> {
            btnCancelar.setVisible(true);
            btnGuardar.setVisible(true);
            btnEditar.setVisible(false);
            btnImprimirRepo.setVisible(false);
            btnEditarFirmas.setVisible(false);
            if (firmaUsuarioImg != null && firmaUsuarioImg.getParent().isPresent()) {
                userSignLayout.replace(firmaUsuarioImg, userSignPad);
            }
            if (firmaSmtImg != null && firmaSmtImg.getParent().isPresent()) {
                smtSignLayout.replace(firmaSmtImg, smtSignPad);
            }
        });

        btnCancelar.addClickListener(e -> {
            txtEquipo.setReadOnly(true);
            cbTipo.setReadOnly(true);
            txtFecha.setReadOnly(true);
            cbUsuario.setReadOnly(true);
            cbDepartamento.setReadOnly(true);
            btnImprimirRepo.setVisible(true);
            btnEditar.setVisible(true);
            btnGuardar.setVisible(false);
            btnCancelar.setVisible(false);
            btnEditarFirmas.setVisible(true);
            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);
            }
        });


        btnImprimirRepo.addClickListener(e -> {
            try {
                // Prepara los parámetros para el reporte
                Map<String, Object> parametros = new HashMap<>();
                parametros.put("PLAN_ID", planAnualIdActual);

                // Genera el PDF
                byte[] pdf = reportService.generarReporte("mantenimientoReport", parametros);

                // Se crea el recurso para descarga
                StreamResource resource = new StreamResource("reporte.pdf", () -> new ByteArrayInputStream(pdf));
                /*Anchor downloadLink = new Anchor(resource, "Descargar Reporte");
                downloadLink.setTarget("_blank");
                downloadLink.setId("descargar-reporte-link");
                add(downloadLink);

                getUI().ifPresent(ui ->
                        ui.getPage().executeJs("document.getElementById('descargar-reporte-link').click();")
                );*/

                StreamRegistration registration = UI.getCurrent().getSession().getResourceRegistry().registerResource(resource);
                UI.getCurrent().getPage().executeJs("window.open('" + registration.getResourceUri().toString() + "','_blank')");

            } catch (Exception ex) {
                Notification.show("Error al generar el reporte: " + ex.getMessage(), 4000, Notification.Position.MIDDLE)
                        .addThemeVariants(NotificationVariant.LUMO_ERROR);
                logger.error("Error al generar el reporte: ", ex);
            }
        });


        btnEnviarEncuesta.addClickListener(e -> {
            avisoEncuestaNtf.close();
            enviarCorreo();
        });


        // 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);
            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(botonesHeaderLyt,mainLayout);
        this.setSpacing(false);
        this.emailService = emailService;
    }


    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 = !txtFechaProgramada.getValue().isEmpty() ? LocalDate.parse(txtFechaProgramada.getValue(), formatter) : null;
        LocalDate fechaRealizado = !txtFecha.getValue().isEmpty() ? LocalDate.parse(txtFecha.getValue(), formatter) : null;



        // Obtener las firmas como en MantenimientoView
        byte[] userSignatureBytes = userSignPad.getImageBase64();
        byte[] smtSignatureBytes = smtSignPad.getImageBase64();

        String userSignatureBase64 = (userSignatureBytes != null) ? Base64.getEncoder().encodeToString(userSignatureBytes) : null;
        String smtSignatureBase64 = (smtSignatureBytes != null) ? Base64.getEncoder().encodeToString(smtSignatureBytes) : null;

        // Si la firma está vacía, conserva la anterior
        if (userSignatureBase64 == null || esFirmaVacia(userSignatureBase64)) {
            userSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaUser();
        }
        if (smtSignatureBase64 == null || esFirmaVacia(smtSignatureBase64)) {
            smtSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaSmt();
        }


        // ACTUALIZA PLANANUAL (nombre del equipo y fecha programada)
        if (!service.actualizarPlanAnual(planAnualIdActual, txtEquipo.getValue())) {
            exito = false;
        }
        // ACTUALIZA MANTENIMIENTOS (tipo, departamento, usuario, fecha realizado)
        if (!service.actualizarMantenimiento(
                mantenimientoIdActual,
                tipoId,
                departamentoId,
                empleadoId,
                fechaRealizado,
                txtEquipo.getValue(),
                userSignatureBase64,
                smtSignatureBase64
        )) {
            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);
        cbUsuario.setReadOnly(true);
        cbDepartamento.setReadOnly(true);
        btnImprimirRepo.setVisible(true);
        btnEditar.setVisible(true);
        btnEditarFirmas.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 = "iVBORw0KGgoAAAANSUhEUgAAAdQAAAD8CAYAAADOr1WDAAAKOElEQVR4Xu3VsQ0AIAwEMbL/0IBYgStNTwrrpZt93/IIECBAgACBL4ER1C8/nwkQIECAwBMQVEMgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgACBA8Bc7Tp3N5/2AAAAAElFTkSuQmCC";
        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);
    }


    // METODO PARA ENVIAR LOS CORREOS ELECTRONICOS
    private void enviarCorreo() {
        Usuario usuarioDestino = cbUsuario.getValue();
        if (usuarioDestino != null && usuarioDestino.getEmail() != null) {
            try {
                String token = service.crearTokenEncuesta(mantenimientoIdActual);

                String destinatario = usuarioDestino.getEmail();
                String asunto = "Encuesta de satisfacción - Mantenimiento #" + mantenimientoIdActual;
                String linkEncuesta = baseUrl + "/encuesta?token=" + token;
                String cuerpo = "<html><body><a href='" + linkEncuesta + "'><img src='cid:image_id'/></a></body></html>";
                String imagePath = "META-INF/resources/images/imgCorreo/imgEncuesta.png";

                emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath);

                Notification.show("Encuesta enviada correctamente", 3000, Notification.Position.BOTTOM_END)
                        .addThemeVariants(NotificationVariant.LUMO_SUCCESS);

            } catch (Exception e) {
                Notification.show("Error: No se pudo enviar. Es probable que ya exista una encuesta generada.",
                                5000, Notification.Position.MIDDLE)
                        .addThemeVariants(NotificationVariant.LUMO_ERROR);
            }
        } else {
            Notification.show("Por favor, seleccione un usuario destino", 3000, Notification.Position.MIDDLE);
        }
    }


    @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;

        String encParam = event.getLocation().getQueryParameters().getParameters().getOrDefault("enc", List.of())
                .stream().findFirst().orElse("N").toUpperCase();

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

                DetalleMantenimientoModel detalle = service.getDetalleMantenimientoPorPlanAnualId(planId);

                if (encParam.equalsIgnoreCase("N")) {
                    Icon icono = new Icon(VaadinIcon.WARNING);
                    icono.setSize("40px");
                    NativeLabel aviso = new NativeLabel("Aviso:");
                    aviso.getStyle().set("font-weight", "bold");
                    NativeLabel label = new NativeLabel("¡No se ha respondido una encuesta para este mantenimiento!");

                    VerticalLayout textLyt = new VerticalLayout(aviso,label);
                    textLyt.setPadding(false);
                    textLyt.setSpacing(false);
                    HorizontalLayout layout = new HorizontalLayout(icono, textLyt);
                    layout.setJustifyContentMode(JustifyContentMode.CENTER);
                    layout.setAlignItems(Alignment.CENTER);

                    avisoEncuestaNtf = new Notification(layout);
                    avisoEncuestaNtf.setPosition(Notification.Position.TOP_END);
                    avisoEncuestaNtf.addThemeVariants(NotificationVariant.LUMO_WARNING);
                    avisoEncuestaNtf.setDuration(5000);
                    avisoEncuestaNtf.open();

                } else {
                    btnEnviarEncuesta.setEnabled(false);
                    btnEnviarEncuesta.getStyle().set("opacity", "0.5");
                }

                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)
                    );
                    mantId.setValue(String.valueOf(mantenimientoIdActual));
                    mantId.setReadOnly(true);
                    mantId.setWidth("100px");

                    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) : "";
                    String situacion = detalle.getSituacion() != null ? detalle.getSituacion() : "";

                    txtFechaProgramada.setValue(fechaProg);
                    txtFecha.setValue(fechaReal);
                    txtSituacion.setValue(situacion);
                    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/FirmaGerenteTI.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");
            }
        }
    }
}