@page "/Pendientes"
@rendermode InteractiveServer
@using GestionaDenunciasAN.Models
@using System.Globalization
@using System.IO
@using System.Linq
@using System.Text
@using GestionaDenunciasAN.Helpers  // Para PdfHelper
@attribute [StreamRendering]
@inject GestionaDenunciasAN.Models.UserState userState
@inject NavigationManager Navigation
@inject IHostEnvironment HostEnvironment

<PageTitle>Denuncias Pendientes</PageTitle>

<style>
    .seleccionar-col {
        width: 50px;
        text-align: center;
        vertical-align: middle;
    }

    /* Contenedor para la lista de denuncias */
    .pendientes-list {
        margin-top: 20px;
    }
    /* Estilo general para cada card, con animaciones y transiciones */
    .collapse-card {
        margin-bottom: 1rem;
        border: 1px solid #ccc;
        border-radius: 6px;
        box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        overflow: hidden;
        transition: transform 0.3s ease, box-shadow 0.3s ease;
        background-color: #fff;
    }

        .collapse-card:hover {
            transform: scale(1.02);
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
        }
    /* Estilos para la cabecera de la card */
    .card-header {
        padding: 0.75rem 1.25rem;
        cursor: pointer;
        background-color: #f7f7f7;
        transition: background-color 0.3s ease;
    }

        .card-header:hover {
            background-color: #e2e2e2;
        }
    /* Estilos para los títulos de sección */
    .section-heading {
        text-align: center;
        font-weight: bold;
        text-decoration: underline;
        font-size: 1.1em;
        margin-top: 1rem;
        margin-bottom: 0.5rem;
    }
    /* Estilos personalizados para el modal (envío a gestión y rechazo) */
    .custom-modal {
        background: rgba(0, 0, 0, 0.5);
    }

    .custom-modal-dialog {
        max-width: 500px;
        margin: 2rem auto;
    }

    .custom-modal-content {
        border-radius: 0.5rem;
        box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
        border: none;
    }

    .custom-modal-header {
        background-color: #007bff;
        color: white;
        border-top-left-radius: 0.5rem;
        border-top-right-radius: 0.5rem;
        padding: 1rem;
    }

    .custom-modal-body {
        padding: 1.5rem;
        background-color: #f8f9fa;
    }

    .custom-modal-footer {
        border-top: none;
        padding: 1rem;
    }

    .modal-section-heading {
        font-weight: bold;
        font-size: 1.1em;
        margin-bottom: 0.5rem;
        border-bottom: 2px solid #007bff;
        padding-bottom: 0.25rem;
    }

    .custom-file-list .list-group-item {
        transition: background-color 0.2s ease;
        cursor: pointer;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }

        .custom-file-list .list-group-item:hover {
            background-color: #e9ecef;
        }

        .custom-file-list .list-group-item.active {
            background-color: #007bff;
            color: white;
            border-color: #007bff;
        }

    .preselect-btn {
        background: none;
        border: none;
        padding: 0;
        margin: 0;
        font-size: 1.2rem;
        cursor: pointer;
    }

        .preselect-btn i {
            transition: color 0.3s ease;
        }

        .preselect-btn.selected i {
            color: #28a745;
        }

        .preselect-btn:not(.selected) i {
            color: #6c757d;
        }
</style>

<h1>Denuncias Pendientes</h1>

<!-- Campo de búsqueda en tiempo real -->
<input type="text"
       class="form-control"
       placeholder="Buscar denuncias..."
       @bind="busqueda"
       @bind:event="oninput"
       style="margin-bottom:20px;" />

@if (!hasLoaded)
{
    <div class="alert alert-info">Cargando datos...</div>
}
else if (pendientes == null || !pendientes.Any())
{
    <p>No hay denuncias pendientes.</p>
}
else
{
    <div class="pendientes-list">
        @foreach (var denuncia in pendientes.Where(d =>
       string.IsNullOrWhiteSpace(busqueda) ||
       d.Id_Denuncia.ToString().Contains(busqueda) ||
       (!string.IsNullOrEmpty(d.Asunto) && d.Asunto.Contains(busqueda, StringComparison.OrdinalIgnoreCase)) ||
       (!string.IsNullOrEmpty(d.Nombre) && d.Nombre.Contains(busqueda, StringComparison.OrdinalIgnoreCase)) ||
       (!string.IsNullOrEmpty(d.Apellidos) && d.Apellidos.Contains(busqueda, StringComparison.OrdinalIgnoreCase))
       ))
        {
            var collapseId = $"collapse{denuncia.Id_Denuncia}";
            <div class="card mb-2 collapse-card">
                <div class="card-header d-flex justify-content-between align-items-center"
                     data-bs-toggle="collapse"
                     data-bs-target="#@collapseId"
                     aria-expanded="false"
                     aria-controls="@collapseId">
                    <div class="d-flex align-items-center">
                        <h5 class="mb-0">Denuncia ID: @denuncia.Id_Denuncia</h5>
                    </div>
                    <div>
                        <button class="btn btn-success btn-sm me-2"
                                @onclick:stopPropagation="true"
                                @onclick="() => OpenEnviarAGestionaModal(denuncia)">
                            Configurar subida
                        </button>
                        <button class="btn btn-danger btn-sm"
                                @onclick:stopPropagation="true"
                                @onclick="() => OpenRechazarModal(denuncia)">
                            Rechazar denuncia
                        </button>
                    </div>
                </div>
                <div id="@collapseId" class="collapse">
                    <div class="card-body">
                        <!-- Datos Generales -->
                        <h5 class="section-heading">Datos Generales</h5>
                        <dl class="row">
                            @if (denuncia.Id_RegistroDenuncia != 0)
                            {
                                <dt class="col-sm-3">ID Registro Denuncia</dt>
                                <dd class="col-sm-9">@denuncia.Id_RegistroDenuncia</dd>
                            }
                            @if (denuncia.Id_Denuncia != 0)
                            {
                                <dt class="col-sm-3">ID Denuncia</dt>
                                <dd class="col-sm-9">@denuncia.Id_Denuncia</dd>
                            }
                            @if (denuncia.Fecha != DateTime.MinValue)
                            {
                                <dt class="col-sm-3">Fecha</dt>
                                <dd class="col-sm-9">@denuncia.Fecha.ToString("dd/MM/yyyy HH:mm")</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Expediente_Gestiona))
                            {
                                <dt class="col-sm-3">Expediente Gestiona</dt>
                                <dd class="col-sm-9">@denuncia.Expediente_Gestiona</dd>
                            }
                            @if (denuncia.Id_Persona_Gestiona != 0)
                            {
                                <dt class="col-sm-3">ID Persona Gestiona</dt>
                                <dd class="col-sm-9">@denuncia.Id_Persona_Gestiona</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Etiqueta))
                            {
                                <dt class="col-sm-3">Etiqueta</dt>
                                <dd class="col-sm-9">@denuncia.Etiqueta</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Estado))
                            {
                                <dt class="col-sm-3">Estado</dt>
                                <dd class="col-sm-9">@denuncia.Estado</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Tipo_Denuncia))
                            {
                                <dt class="col-sm-3">Tipo Denuncia</dt>
                                <dd class="col-sm-9">@denuncia.Tipo_Denuncia</dd>
                            }
                        </dl>

                        <!-- Datos del Denunciante -->
                        @if (!string.IsNullOrWhiteSpace(denuncia.Nombre) ||
                       !string.IsNullOrWhiteSpace(denuncia.Apellidos) ||
                       !string.IsNullOrWhiteSpace(denuncia.Sexo) ||
                       !string.IsNullOrWhiteSpace(denuncia.Dni))
                        {
                            <h5 class="section-heading">Datos del Denunciante</h5>
                            <dl class="row">
                                @if (!string.IsNullOrWhiteSpace(denuncia.Nombre))
                                {
                                    <dt class="col-sm-3">Nombre</dt>
                                    <dd class="col-sm-9">@denuncia.Nombre</dd>
                                }
                                @if (!string.IsNullOrWhiteSpace(denuncia.Apellidos))
                                {
                                    <dt class="col-sm-3">Apellidos</dt>
                                    <dd class="col-sm-9">@denuncia.Apellidos</dd>
                                }
                                @if (!string.IsNullOrWhiteSpace(denuncia.Sexo))
                                {
                                    <dt class="col-sm-3">Sexo</dt>
                                    <dd class="col-sm-9">@denuncia.Sexo</dd>
                                }
                                @if (!string.IsNullOrWhiteSpace(denuncia.Dni))
                                {
                                    <dt class="col-sm-3">DNI</dt>
                                    <dd class="col-sm-9">@denuncia.Dni</dd>
                                }
                            </dl>
                        }

                        <!-- Detalles de la Denuncia -->
                        <h5 class="section-heading">Detalles de la Denuncia</h5>
                        <dl class="row">
                            <dt class="col-sm-3">Asunto</dt>
                            <dd class="col-sm-9">@denuncia.Asunto</dd>
                            <dt class="col-sm-3">A Quien Denuncia</dt>
                            <dd class="col-sm-9">@denuncia.A_Quien_Denuncia</dd>
                            <dt class="col-sm-3">Descripción Denuncia</dt>
                            <dd class="col-sm-9">@denuncia.Descripcion_Denuncia</dd>
                            <dt class="col-sm-3">Denunciado Ante Inst</dt>
                            <dd class="col-sm-9">@denuncia.Denunciado_Ante_Inst</dd>
                            @if (!string.IsNullOrWhiteSpace(denuncia.Modalidad_Informacion))
                            {
                                <dt class="col-sm-3">Modalidad Información</dt>
                                <dd class="col-sm-9">@denuncia.Modalidad_Informacion</dd>
                            }
                            <dt class="col-sm-3">Lugar Hechos</dt>
                            <dd class="col-sm-9">@denuncia.Lugar_Hechos</dd>
                            @if (denuncia.Fecha_Hechos != DateTime.MinValue)
                            {
                                <dt class="col-sm-3">Fecha Hechos</dt>
                                <dd class="col-sm-9">@denuncia.Fecha_Hechos.ToString("dd/MM/yyyy")</dd>
                            }
                        </dl>

                        <!-- Datos de Notificación -->
                        <h5 class="section-heading">Datos de Notificación</h5>
                        <dl class="row">
                            @if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Preferencia))
                            {
                                <dt class="col-sm-3">Notificación Preferencia</dt>
                                <dd class="col-sm-9">@denuncia.Notificacion_Preferencia</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Electronica))
                            {
                                <dt class="col-sm-3">Notificación Electrónica</dt>
                                <dd class="col-sm-9">@denuncia.Notificacion_Electronica</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Correo_Electronico))
                            {
                                <dt class="col-sm-3">Correo Electrónico</dt>
                                <dd class="col-sm-9">@denuncia.Correo_Electronico</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Sms))
                            {
                                <dt class="col-sm-3">Notificación SMS</dt>
                                <dd class="col-sm-9">@denuncia.Notificacion_Sms</dd>
                            }
                        </dl>

                        <!-- Otros -->
                        <h5 class="section-heading">Otros</h5>
                        <dl class="row">
                            @if (denuncia.Condiciones)
                            {
                                <dt class="col-sm-3">Condiciones</dt>
                                <dd class="col-sm-9">Sí</dd>
                            }
                            @if (!string.IsNullOrWhiteSpace(denuncia.Comments))
                            {
                                <dt class="col-sm-3">Comentarios</dt>
                                <dd class="col-sm-9"><pre>@denuncia.Comments</pre></dd>
                            }
                        </dl>

                        <!-- Ficheros adjuntos (lista principal) -->
                        @if (ficherosAdjuntos.ContainsKey(denuncia.Id_Denuncia) && ficherosAdjuntos[denuncia.Id_Denuncia].Any())
                        {
                            <h5 class="section-heading">Ficheros Adjuntos</h5>
                            <table class="table table-striped">
                                <thead>
                                    <tr>
                                        <th class="seleccionar-col">Seleccionar</th>
                                        <th>Nombre</th>
                                        <th>Tamaño (bytes)</th>
                                        <th>Ver</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    @foreach (var fichero in ficherosAdjuntos[denuncia.Id_Denuncia])
                                    {
                                        <tr>
                                            <td class="seleccionar-col">
                                                <button class="preselect-btn @(preselectedFicheros.ContainsKey(denuncia.Id_Denuncia) && preselectedFicheros[denuncia.Id_Denuncia] == fichero.NombreFichero ? "selected" : "")"
                                                        @onclick="() => PreselectFichero(denuncia.Id_Denuncia, fichero.NombreFichero)">
                                                    @if (preselectedFicheros.ContainsKey(denuncia.Id_Denuncia) && preselectedFicheros[denuncia.Id_Denuncia] == fichero.NombreFichero)
                                                    {
                                                        <i class="bi bi-check-circle-fill"></i>
                                                    }
                                                    else
                                                    {
                                                        <i class="bi bi-circle"></i>
                                                    }
                                                </button>
                                            </td>
                                            <td>@fichero.NombreFichero</td>
                                            <td>@fichero.Fichero.Length</td>
                                            <td>
                                                <a class="btn btn-primary btn-sm" href="#"
                                                   onclick="openFile(event, '@Convert.ToBase64String(fichero.Fichero)', '@GetContentType(fichero.NombreFichero)');">
                                                    <i class="bi bi-eye"></i> Ver
                                                </a>
                                            </td>
                                        </tr>
                                    }
                                </tbody>
                            </table>
                        }
                    </div>
                </div>
            </div>
        }
    </div>
}

<script>
    function createObjectUrl(base64, contentType) {
        const binaryString = window.atob(base64);
        const len = binaryString.length;
        const bytes = new Uint8Array(len);
        for (let i = 0; i < len; i++) {
            bytes[i] = binaryString.charCodeAt(i);
        }
        const blob = new Blob([bytes], { type: contentType });
        return URL.createObjectURL(blob);
    }
    function openFile(event, base64, contentType) {
        event.preventDefault();
        event.stopPropagation();
        const objectUrl = createObjectUrl(base64, contentType);
        window.open(objectUrl, '_blank');
    }
</script>

@* Modal para Configurar Subida a Gestión *@
@if (showModal && selectedDenuncias != null)
{
    <div class="modal custom-modal fade show" style="display:block;" tabindex="-1">
        <div class="modal-dialog custom-modal-dialog">
            <div class="modal-content custom-modal-content">
                <div class="modal-header custom-modal-header">
                    <h5 class="modal-title">Enviar a Gestión</h5>
                    <button type="button" class="btn-close" @onclick="CloseModal"></button>
                </div>
                <div class="modal-body custom-modal-body">
                    <h6 class="modal-section-heading">Información de la Denuncia</h6>
                    <div class="mb-3">
                        <input type="text" class="form-control" @bind="nuevoNombre" placeholder="Ingrese el nombre de la denuncia" />
                    </div>
                    <h6 class="modal-section-heading">Selecciona el Fichero</h6>
                    <div class="mb-3">
                        <ul class="list-group custom-file-list">
                            @if (ficherosAdjuntos.ContainsKey(selectedDenuncias.Id_Denuncia))
                            {
                                foreach (var fichero in ficherosAdjuntos[selectedDenuncias.Id_Denuncia])
                                {
                                    <li class="list-group-item @(archivoSeleccionado == fichero.NombreFichero ? "active" : "")"
                                        @onclick="() => SelectArchivo(fichero.NombreFichero)">
                                        <span>@fichero.NombreFichero</span>
                                        <button class="btn btn-primary btn-sm"
                                                onclick="openFile(event, '@Convert.ToBase64String(fichero.Fichero)', '@GetContentType(fichero.NombreFichero)')">
                                            <i class="bi bi-eye"></i> Ver
                                        </button>
                                    </li>
                                }
                            }
                            <li class="list-group-item @(archivoSeleccionado == reportTxt ? "active" : "")"
                                @onclick="() => SelectArchivo(reportTxt)">
                                <span>report.txt</span>
                            </li>
                        </ul>
                    </div>
                </div>
                <div class="modal-footer custom-modal-footer">
                    <button type="button" class="btn btn-secondary" @onclick="CloseModal">Cancelar</button>
                    <button type="button" class="btn btn-primary" @onclick="ConfirmarEnvio">Confirmar</button>
                </div>
            </div>
        </div>
    </div>
    <div class="modal-backdrop fade show"></div>
}

@* Modal para Rechazar Denuncia *@
@if (showModalRechazo && selectedDenuncias != null)
{
    <div class="modal custom-modal fade show" style="display:block;" tabindex="-1">
        <div class="modal-dialog custom-modal-dialog">
            <div class="modal-content custom-modal-content">
                <div class="modal-header custom-modal-header">
                    <h5 class="modal-title">Rechazar Denuncia</h5>
                    <button type="button" class="btn-close" @onclick="CloseRechazoModal"></button>
                </div>
                <div class="modal-body custom-modal-body">
                    <h6 class="modal-section-heading">Motivo de Rechazo</h6>
                    <div class="mb-3">
                        <input type="text" class="form-control" @bind="motivoRechazo" placeholder="Ingrese el motivo de rechazo" />
                    </div>
                </div>
                <div class="modal-footer custom-modal-footer">
                    <button type="button" class="btn btn-secondary" @onclick="CloseRechazoModal">Cancelar</button>
                    <button type="button" class="btn btn-primary" @onclick="ConfirmarRechazo">Confirmar</button>
                </div>
            </div>
        </div>
    </div>
    <div class="modal-backdrop fade show"></div>
}

@code {
    private const string reportTxt = "report.txt";
    private const string FIXED_PATH = @"C:\ZipsDenuncias";

    private string busqueda = "";
    private List<DenunciasGestiona> pendientes = new();
    private Dictionary<int, List<FicherosDenuncias>> ficherosAdjuntos = new();
    private Dictionary<int, string> preselectedFicheros = new();

    private const string DENUNCIAS_JSON = @"C:\ZipsDenuncias\denuncias.json";
    private const string FICHEROS_JSON = @"C:\ZipsDenuncias\ficheros.json";

    private bool hasLoaded = false;
    private bool showModal = false;
    private bool showModalRechazo = false;

    private DenunciasGestiona selectedDenuncias;
    private string nuevoNombre;
    private string archivoSeleccionado = reportTxt;
    private string motivoRechazo;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            if (string.IsNullOrEmpty(userState.Token))
            {
                Navigation.NavigateTo("/", true);
                return;
            }
            await CargarDatosAsync();
        }
    }

    private async Task CargarDatosAsync()
    {
        var todas = await CargarDenunciasJsonAsync();
        pendientes = todas.Where(d => d.Expediente_Gestiona == "Pendiente").ToList();

        var listaF = await CargarFicherosJsonAsync();
        ficherosAdjuntos = listaF
            .GroupBy(f => f.Id_Denuncia)
            .ToDictionary(g => g.Key, g => g.ToList());

        hasLoaded = true;
        StateHasChanged();
    }

    private async Task<List<DenunciasGestiona>> CargarDenunciasJsonAsync()
    {
        if (!File.Exists(DENUNCIAS_JSON)) return new();
        var json = await File.ReadAllTextAsync(DENUNCIAS_JSON);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<List<DenunciasGestiona>>(json)
               ?? new List<DenunciasGestiona>();
    }

    private async Task<List<FicherosDenuncias>> CargarFicherosJsonAsync()
    {
        if (!File.Exists(FICHEROS_JSON)) return new();
        var json = await File.ReadAllTextAsync(FICHEROS_JSON);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<List<FicherosDenuncias>>(json)
               ?? new List<FicherosDenuncias>();
    }

    private async Task ConfirmarEnvio()
    {
        if (selectedDenuncias == null)
            return;

        // 1) Recolectar todos los ficheros adjuntos
        var todos = new List<(string FileName, byte[] Content)>();
        if (ficherosAdjuntos.TryGetValue(selectedDenuncias.Id_Denuncia, out var listaAdjuntos))
        {
            todos.AddRange(listaAdjuntos.Select(f => (f.NombreFichero, f.Fichero)));
        }

        // 2) Buscar y añadir report.txt correspondiente a esta denuncia
        //    Se busca en todos los subdirectorios de FIXED_PATH los report.txt
        var reportFiles = Directory.GetFiles(FIXED_PATH, "report.txt", SearchOption.AllDirectories);
        foreach (var rpt in reportFiles)
        {
            // Leer encabezado para verificar que es el report de esta denuncia
            var contenido = await File.ReadAllTextAsync(rpt, Encoding.UTF8);
            if (contenido.Contains($"ID: {selectedDenuncias.Id_Denuncia}"))
            {
                todos.Add(("report.txt", Encoding.UTF8.GetBytes(contenido)));
                break;
            }
        }

        // 3) Fusionar todos los ficheros (incluyendo report.txt) en un único PDF
        var pdfBytes = PdfHelper.MergeFilesToPdf(todos);

        // 4) Guardar el PDF combinado
        var outDir = Path.Combine(FIXED_PATH, "CombinedPdfs");
        Directory.CreateDirectory(outDir);
        var pdfName = $"Denuncia_{selectedDenuncias.Id_Denuncia}.pdf";
        var pdfPath = Path.Combine(outDir, pdfName);
        await File.WriteAllBytesAsync(pdfPath, pdfBytes);

        // 5) Actualizar la denuncia
        selectedDenuncias.ArchivoElegido = pdfName;
        selectedDenuncias.NombreDenuncia = nuevoNombre;
        selectedDenuncias.Expediente_Gestiona = "Gestiona";
        selectedDenuncias.FechaSubidaAGestiona = DateTime.Now;
        await ActualizarDenunciaAsync(selectedDenuncias);

        // 6) Refrescar UI
        pendientes.Remove(selectedDenuncias);
        CloseModal();
        StateHasChanged();
    }


    private async Task ConfirmarRechazo()
    {
        if (selectedDenuncias == null) return;

        selectedDenuncias.Expediente_Gestiona = "Rechazada";
        selectedDenuncias.NombreDenuncia = motivoRechazo;
        selectedDenuncias.FechaSubidaAGestiona = DateTime.Now;
        await ActualizarDenunciaAsync(selectedDenuncias);

        pendientes.Remove(selectedDenuncias);
        CloseRechazoModal();
        StateHasChanged();
    }

    private async Task ActualizarDenunciaAsync(DenunciasGestiona d)
    {
        var todas = await CargarDenunciasJsonAsync();
        var reg = todas.FirstOrDefault(x => x.Id_Denuncia == d.Id_Denuncia);
        if (reg != null)
        {
            reg.Expediente_Gestiona = d.Expediente_Gestiona;
            reg.ArchivoElegido = d.ArchivoElegido;
            reg.NombreDenuncia = d.NombreDenuncia;
            reg.FechaSubidaAGestiona = d.FechaSubidaAGestiona;
        }
        var json = Newtonsoft.Json.JsonConvert.SerializeObject(todas, Newtonsoft.Json.Formatting.Indented);
        await File.WriteAllTextAsync(DENUNCIAS_JSON, json);
    }

    private void OpenEnviarAGestionaModal(DenunciasGestiona d)
    {
        selectedDenuncias = d;
        nuevoNombre = string.Empty;
        archivoSeleccionado = preselectedFicheros.GetValueOrDefault(d.Id_Denuncia, reportTxt);
        showModal = true;
    }

    private void OpenRechazarModal(DenunciasGestiona d)
    {
        selectedDenuncias = d;
        motivoRechazo = string.Empty;
        showModalRechazo = true;
    }

    private void CloseModal() =>
        (showModal, selectedDenuncias, nuevoNombre, archivoSeleccionado) =
        (false, null, string.Empty, reportTxt);

    private void CloseRechazoModal() =>
        (showModalRechazo, selectedDenuncias, motivoRechazo) =
        (false, null, string.Empty);

    private void SelectArchivo(string f) => archivoSeleccionado = f;
    private void PreselectFichero(int id, string f) => preselectedFicheros[id] = f;

    private string GetContentType(string fileName)
    {
        return Path.GetExtension(fileName).ToLowerInvariant() switch
        {
            ".jpg" or ".jpeg" => "image/jpeg",
            ".png" => "image/png",
            ".gif" => "image/gif",
            ".pdf" => "application/pdf",
            ".txt" => "text/plain",
            _ => "application/octet-stream",
        };
    }
}
