@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.clases
@using bdAntifraude.db

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

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

</div>

<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>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">


            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Descripcion:</label>
                <InputText @bind-Value="itemSeleccionado!.DESCRIPCION" class="inputForm"></InputText>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Centro:</label>
                <InputText @bind-Value="itemSeleccionado!.CENTRO" class="inputForm"></InputText>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha expedicion:</label>
                <InputDate @bind-Value="itemSeleccionado!.FECHA_EXPEDICION" class="inputForm"></InputDate>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha Insc. Provisional:</label>
                <InputDate @bind-Value="itemSeleccionado!.FECHA_INSCRIPCION_PROVISIONAL" class="inputForm"></InputDate>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha Insc. Definitiva:</label>
                <InputDate @bind-Value="itemSeleccionado!.FECHA_INSCRIPCION_DEFINITIVA" class="inputForm"></InputDate>
            </div>

            <div class="col-12 formatoCampos">
                <p class="lblinputRP">Fichero:</p>
                <InputFile class="inputForm" OnChange="LoadFile"></InputFile>
            </div>

        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDTITULACION != 0)
        {
            <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<!-- Grid de BlazorBootstrap con la misma estética -->
<Grid TItem="TITULACIONES"
      Class="table tablaRegPers"
      Data="titulacionesItems"
      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 TItem="TITULACIONES" HeaderText="Descripción" PropertyName="Descripcion">
            @if (context.RUTA != null){
                <a href="@urlFich(context.IDTITULACION)" target="_blank"> @context.DESCRIPCION</a>
            }
            else
            {
                @context.DESCRIPCION
            }
        </GridColumn>
        <GridColumn TItem="TITULACIONES" HeaderText="Centro" PropertyName="Centro" >
            @context.CENTRO 
        </GridColumn>
        <GridColumn TItem="TITULACIONES" HeaderText="Fecha Expedición" PropertyName="FechaExpedicion">
            @context.FECHA_EXPEDICION?.ToShortDateString()
        </GridColumn>
        <GridColumn TItem="TITULACIONES" HeaderText="Fecha Inscripción Provisional" PropertyName="FechaInscripcionProvisional">
            @context.FECHA_INSCRIPCION_PROVISIONAL?.ToShortDateString() 
        </GridColumn>
        <GridColumn TItem="TITULACIONES" HeaderText="Fecha Inscripción Definitiva" PropertyName="FechaInscripcionDefinitiva">
            @context.FECHA_INSCRIPCION_DEFINITIVA?.ToShortDateString() 
        </GridColumn>
    
        <GridColumn TItem="bdAntifraude.db.TITULACIONES" HeaderText="">
            <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>

@code {
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();
    private List<TITULACIONES> titulacionesItems = new List<TITULACIONES>();
    private HttpClient cliente = new HttpClient();
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;
    private string tituloPopup = "";
    private TITULACIONES itemSeleccionado = new TITULACIONES();
    List<ToastMessage> mensajes = new List<ToastMessage>();
    private string Base64File { get; set; } = ""; // Para almacenar el archivo convertido
    private string FileName { get; set; } = ""; // Para almacenar el nombre del archivo


    protected override async Task OnInitializedAsync()
    {
        try
        {

            cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

            if (Persona?.IDPERSONA != null && Persona!.IDPERSONA > 0)
            {
                await ObtenerLista();

                if(titulacionesItems == null)
                {
                    titulacionesItems = new List<TITULACIONES>();
                }
            }
            else
            {
                Console.WriteLine("Persona no está completamente cargada.");
            }

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task ObtenerLista()
    {
        titulacionesItems = await Utilidades.ObtenerObjeto<List<TITULACIONES>>(cliente, "/api/TITULACIONES/GetWithIncludes/" + Persona.IDPERSONA);
    }
    private async Task abrirPopupGestionDatos(TITULACIONES objeto)
    {
        itemSeleccionado = objeto;

        if (itemSeleccionado.IDTITULACION != 0)
        {
            tituloPopup = "Modificar Titulación";
        }
        else
        {
            tituloPopup = "Nueva Titulación";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONA = Persona.IDPERSONA;



        switch (accion)
        {

            case "update":

                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/TITULACIONES/" + itemSeleccionado.IDTITULACION, itemSeleccionado);
                await SubirArchivo(responsea);

                break;

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

                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/TITULACIONES/" + itemSeleccionado.IDTITULACION);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        await ObtenerLista();
        await InvokeAsync(StateHasChanged);
        cerrarPopupGestionDatos();
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    private async Task abrirPopupConfirmarBorrado(TITULACIONES objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
    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.");
                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);

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar el archivo: {ex.Message}");
        }
    }
    private async Task SubirArchivo(TITULACIONES titulacion)
    {
        if (Base64File != "")
        {
            string ruta = "titulacion/" + titulacion.IDTITULACION.ToString() + ".pdf";
            titulacion.RUTA = ruta;

            var responsesa = await Utilidades.ActualizarObjeto(cliente, "/api/TITULACIONES/" + titulacion.IDTITULACION, titulacion);

            AlmacenaFicheroAtransmitir afa = new AlmacenaFicheroAtransmitir();
            afa.IdRegistro = titulacion.IDTITULACION;
            afa.Tabla = "TITULACION";
            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.",
                });
        }

    }
    protected string urlFich(int id)
    {
        return "/Ficheros?tip=VerTit&id=" + id.ToString();
    }
    private async Task btnExportarPDF()
    {
        var itm = titulacionesItems
      .Select(f => new
      {
          Descripción = f.DESCRIPCION,
          Centro = f.CENTRO,
          Fecha_Expedición = f.FECHA_EXPEDICION?.ToShortDateString(),
          Fecha_Inscripción_Provisional = f.FECHA_INSCRIPCION_PROVISIONAL?.ToShortDateString(),
          Fecha_Inscripción_Definitiva = f.FECHA_INSCRIPCION_DEFINITIVA?.ToShortDateString(),
        
      })
      .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,
        $"Titulaciones_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = titulacionesItems
      .Select(f => new
      {
          Descripción = f.DESCRIPCION,
          Centro = f.CENTRO,
          Fecha_Expedición = f.FECHA_EXPEDICION?.ToShortDateString(),
          Fecha_Inscripción_Provisional = f.FECHA_INSCRIPCION_PROVISIONAL?.ToShortDateString(),
          Fecha_Inscripción_Definitiva = f.FECHA_INSCRIPCION_DEFINITIVA?.ToShortDateString(),

      })
      .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,
           $"Titulaciones_{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>