@using BlazorBootstrap
@using Newtonsoft.Json
@using RegistroPersonalAN.Models
@using Serialize.Linq.Serializers
@using System.Linq.Expressions
@using System.Net.Http.Headers
@using System.Text
@using bdAntifraude.db
@using bdAntifraude.clases

@inject IJSRuntime JS
@inject UserState UserState
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject NavigationManager NavigationManager
@inject IJSRuntime JSRuntime

<div class="d-flex justify-content-between mt-3">
    <div>
        <button class="btnOAAFAzul" @onclick="btnExportarExcel">Exportar Excel</button>
        <button class="btnOAAFAzul" @onclick="btnExportarPDF">Exportar PDF</button>
    </div>
    <button @onclick="@(() => abrirPopupGestionDatos(new FORMACION()))" class="btnOAAFAzul  d-flex align-items-center"> <i class="icono-nuevo"></i> Nuevo </button>
</div>

<!-- Grid de BlazorBootstrap -->
<Grid TItem="FORMACION"
      Class="table tablaRegPers"
      Data="formacionItems"
      AllowFiltering="false"
      PageSize="10"
      AllowPaging="true"
      AllowSorting="true"
      EmptyText="No se han encontrado datos"
      Height="100"
      PageSizeSelectorVisible="false"
      PageSizeSelectorItems="@(new int[] { 5, 10, 20, 50 })"
      Responsive="true"
      PaginationItemsTextFormat="{0} - {1} de {2} elementos">

    <GridColumns>
        <GridColumn Class="col-4" TItem="FORMACION" HeaderText="Nombre curso">
            @if (context.RUTA !=null){
                <a href="@urlFich(context.IDFORMACION)" target="_blank">  @context.NOMBRE_CURSO</a>
            }
            else
            {
                @context.NOMBRE_CURSO
            }
        </GridColumn>
        <GridColumn Class="col-2" TItem="FORMACION" HeaderText="Nombre">
            @context.CENTRO
        </GridColumn>
        <GridColumn Class="col-1" TItem="FORMACION" HeaderText="Fecha Finalización">
            @context.FECHA_EXPEDICION?.ToString("dd/MM/yyyy")
        </GridColumn>
        <GridColumn Class="col-1" TItem="FORMACION" HeaderText="Duración" HeaderTextAlignment="Alignment.Center" TextAlignment="Alignment.Center">
            @context.DURACION
        </GridColumn>
        <GridColumn Class="col-1" TItem="FORMACION" HeaderText="Aprovechamiento" HeaderTextAlignment="Alignment.Center" TextAlignment="Alignment.Center">
            @if (context.APROVECHAMIENTO)
            {
                <i class="fa fa-check"></i>
            }
        </GridColumn>
        <GridColumn Class="col-1" TItem="FORMACION" HeaderText="Apto para CPH" HeaderTextAlignment="Alignment.Center" TextAlignment="Alignment.Center">
            @if (context.APTOCPH)
            {
                <i class="fa fa-check"></i>
            }
        </GridColumn>
        <GridColumn Class="col-1" TItem="FORMACION" HeaderText="Oficial" HeaderTextAlignment="Alignment.Center" TextAlignment="Alignment.Center">
            @if (context.OFICIAL)
            {
                <i class="fa fa-check"></i>
            }
        </GridColumn>

        <GridColumn TItem="FORMACION" HeaderText="" Class="col-1">
            <span @onclick="@(() => abrirPopupGestionDatos(@context))" style="cursor: pointer;">
                <Icon CustomIconName="fas fa-edit"></Icon>
            </span>
            <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" style="cursor: pointer;">
                <Icon CustomIconName="fas fa-trash"></Icon>
            </span>
        </GridColumn>
    </GridColumns>
   
</Grid>

<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Nombre Curso:</label>
                <InputText required @bind-Value="itemSeleccionado.NOMBRE_CURSO" class="inputForm" maxlength="300"></InputText>
            </div>
            <div class="col-12 formatoCampos mt-2">
                <label class="tituloLbl">Centro:</label>
                <InputText required @bind-Value="itemSeleccionado.CENTRO" class="inputForm" maxlength="100"></InputText>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha Expedicion:</label>
                <InputDate required @bind-Value="itemSeleccionado.FECHA_EXPEDICION" class="inputForm"></InputDate>
            </div>
            <div class="col-12 formatoCampos mt-2">
                <label class="tituloLbl">Duracion:</label>
                <InputNumber required @bind-Value="itemSeleccionado.DURACION" class="inputForm"/>
            </div>
            <div class="col-12 formatoCampos mt-2">
                <label class="tituloLbl">Fichero Anterior:</label>
                <InputText required @bind-Value="itemSeleccionado.RUTA" class="inputForm"></InputText>
            </div>
            <div class="col-12 formatoCampos mt-2">
                <label class="tituloLbl">Subir Fichero:</label>
                <InputFile class="inputForm" OnChange="LoadFile"></InputFile>
            </div>
            <div class="col-12"><p style="color:red; text-align:center">@mensajeArchivo</p></div>
            <div class="col-6 d-flex align-items-center gap-3  mt-2">
                <label class="tituloLbl">Aprovechamiento:</label>
                <InputCheckbox required @bind-Value="itemSeleccionado.APROVECHAMIENTO" class="inputForm"></InputCheckbox>
            </div>
            <div class="col-3 d-flex align-items-center gap-3 mt-2">
                <label class="tituloLbl">Oficial:</label>
                <InputCheckbox required @bind-Value="itemSeleccionado.OFICIAL" class="inputForm"></InputCheckbox>
            </div>
            <div class="col-3 d-flex align-items-center gap-3 mt-2">
                <label class="tituloLbl">Apto CPH:</label>
                <InputCheckbox required @bind-Value="itemSeleccionado.APTOCPH" class="inputForm"></InputCheckbox>
            </div>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDFORMACION != 0)
        {
            <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<Modal @ref="popupConfirmarBorrado" title="" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">
            ¿Estás seguro que desea eliminarlo?
        </div>

    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupConfirmarBorrado">Cerrar</Button>
        <Button @onclick="@(() => BorrarItem())" Color="ButtonColor.Danger">Eliminar</Button>
    </FooterTemplate>
</Modal>


@code {
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();

    private List<FORMACION> formacionItems = new();
    private HttpClient cliente = new HttpClient();

    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;
    private string tituloPopup = "";
    private string mensajeArchivo = "";
    private FORMACION itemSeleccionado = new FORMACION();
    private int idItem = 0;
    List<ToastMessage> mensajes = new List<ToastMessage>();
    private string Base64File { get; set; } = "";// Para almacenar el archivo convertido

    private List<ENUMERACIONES> listaParentescos = new List<ENUMERACIONES>();


    protected override async Task OnInitializedAsync()
    {
        if (Persona?.IDPERSONA != null && Persona.IDPERSONA > 0)
        {
            await CargarFormacion();
        }
        else
        {
            Console.WriteLine("Persona no está completamente cargada.");
        }
    }
    private async Task CargarFormacion()
    {
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        await ObtenerLista();
    }
    private async Task ObtenerLista()
    {
        Expression<Func<FORMACION, bool>> filtro = x => x.IDPERSONA == Persona.IDPERSONA;
        formacionItems = await Utilidades.ObtenerObjeto<List<FORMACION>>(cliente, "/api/FORMACION/filtrar", filtro);
        formacionItems = formacionItems.OrderByDescending(x => x.FECHA_EXPEDICION).ToList();
    }
    private async Task abrirPopupGestionDatos(FORMACION objeto)
    {
        itemSeleccionado = objeto;

        if (idItem != 0)
        {
            tituloPopup = "Modificar Formación";
        }
        else
        {
            tituloPopup = "Nueva Formación";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONA = Persona.IDPERSONA;
        itemSeleccionado.NIF = Persona.NIF;
        switch (accion)
        {
            case "update":
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/FORMACION/" + itemSeleccionado.IDFORMACION, itemSeleccionado);
                await SubirArchivo(itemSeleccionado);

                break;

            case "create":
                var response = await Utilidades.NuevoObjeto(cliente, "/api/FORMACION", itemSeleccionado);
                await SubirArchivo(response);
                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/FORMACION/" + itemSeleccionado.IDFORMACION);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        await ObtenerLista();
        await InvokeAsync(StateHasChanged);
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    private async Task abrirPopupConfirmarBorrado(FORMACION objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
    private async Task SubirArchivo(FORMACION formac)
    {
        if (Base64File != "")
        {
            string ruta = "formacion/" + formac.IDFORMACION.ToString() + ".pdf";
            formac.RUTA = ruta;

            var responsesa = await Utilidades.ActualizarObjeto(cliente, "/api/FORMACION/" + formac.IDFORMACION, formac);

            AlmacenaFicheroAtransmitir afa = new AlmacenaFicheroAtransmitir();
            afa.IdRegistro = formac.IDFORMACION;
            afa.Tabla = "FORMACION";
            afa.Fichero = Base64File;

            var responseFile = await Utilidades.NuevoObjeto(cliente, "/api/Almacenamiento/almacenar-fichero", afa);


        }
        await cerrarPopupGestionDatos();

        mensajes.Add(new ToastMessage
            {
                Type = ToastType.Primary,
                Message = $"Actualizado correctamente.",
            });
    }
    private async Task LoadFile(InputFileChangeEventArgs e)
    {
        try
        {
            var file = e.File;

            // Validación del tamaño del archivo (10 MB máximo)
            const long maxFileSize = 10 * 1024 * 1024; // 10 MB
            if (file.Size > maxFileSize)
            {
                Console.WriteLine("El archivo es demasiado grande. Tamaño máximo permitido: 10 MB.");
                mensajeArchivo = "El archivo es demasiado grande. Tamaño máximo permitido: 10 MB.";
                return;
            }

            // Leer el archivo en un stream
            using var stream = file.OpenReadStream(maxFileSize);
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);

            // Obtener los bytes del archivo
            var fileBytes = memoryStream.ToArray();

            // Convertir los bytes a Base64
            Base64File = Convert.ToBase64String(fileBytes);
            mensajeArchivo = "";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar el archivo: {ex.Message}");
        }
    }
    protected  string urlFich(int id)
    {

        return "/Ficheros?tip=VerFrm&id=" + id.ToString();

    }
    private async Task btnExportarPDF()
    {
        var itm = formacionItems
      .Select(f => new
      {
          Nombre_Curso = f.NOMBRE_CURSO,
          Nombre = f.CENTRO,
          Fecha_Expedición = f.FECHA_EXPEDICION?.ToShortDateString(),
          Duración = f.DURACION,
          Aprovechamiento = f.APROVECHAMIENTO,
          Apto_para_CPH = f.APTOCPH,
          Oficial = f.OFICIAL
      })
      .ToList();
        var logoBytes = await File.ReadAllBytesAsync("wwwroot/Content/imagenes/1oaaflogo.png");

        // Color de cabecera para PDF
        var pdfHeaderColor = new MigraDocCore.DocumentObjectModel.Color(0, 85, 135);

        await Utilidades.ExportarPdfEnBrowser(
            JS,
            itm,
            logoBytes,
            pdfHeaderColor,
        $"ConsolidacionGrado_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = formacionItems
      .Select(f => new
      {
          Nombre_Curso = f.NOMBRE_CURSO,
          Nombre = f.CENTRO,
          Fecha_Expedición = f.FECHA_EXPEDICION?.ToShortDateString(),
          Duración = f.DURACION,
          Aprovechamiento = f.APROVECHAMIENTO,
          Apto_para_CPH = f.APTOCPH,
          Oficial = f.OFICIAL
      })
      .ToList();
        // 2) Carga tu logo (por ejemplo desde wwwroot/images/logo.png)
        var logoBytes = await File.ReadAllBytesAsync("wwwroot/Content/imagenes/1oaaflogo.png");

        // 3) Define el color de cabecera para Excel
        var excelHeaderColor = ClosedXML.Excel.XLColor.FromArgb(0, 85, 135);

        // 4) Llama a tu helper pasando logo y color
        await Utilidades.ExportarExcelEnBrowser(
            JS,
            itm,
            logoBytes,
            excelHeaderColor,
           $"ConsolidacionGrado_{Persona.APELLIDOS}_{Persona.NOMBRE}.xlsx");

        // await Utilidades.ExportarExcelEnBrowser(JS, itm, $"Puestos_{Persona.APELLIDOS}_{Persona.NOMBRE}.xlsx");

    }
}

@* Helper para descargar archivos desde base64 *@
<script>
    window.saveAsFile = (filename, bytesBase64) => {
        const link = document.createElement('a');
        link.download = filename;
        link.href = 'data:application/octet-stream;base64,' + bytesBase64;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    };
</script>