@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
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject UserState UserState
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject NavigationManager NavigationManager
<div class="d-flex gap-1 mt-3">

        <button class="btnOAAFAzul" @onclick="btnExportarExcel">Exportar Excel</button>
        <button class="btnOAAFAzul" @onclick="btnExportarPDF">Exportar PDF</button>
        <button class="btnOAAFAzul d-flex align-items-center" @onclick="nuevoActoAdministrativo">
            Nuevo Acto Administrativo
        </button>
    
   
</div>


<Grid TItem="ACTOSADMINPREP"
      Class="table tablaRegPers"
      Data="actosAdministrativos"
      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="ACTOSADMINPREP" HeaderText="Descripción">
            <a href="@GenerarLink(context.IDACTOADMINISTRATIVO, Persona?.IDPERSONA)">@context.DESCRIPCION</a>
        </GridColumn>
        <GridColumn TItem="ACTOSADMINPREP" HeaderText="Fecha" PropertyName="FECHA">
            @context.FECHA?.ToString("dd/MM/yyyy")
        </GridColumn>
        <GridColumn TItem="ACTOSADMINPREP" HeaderText="Motivo Administrativo" PropertyName="MotivoAdministrativo" >
            @context.IDMOTIVOADMINISTRATIVONavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="ACTOSADMINPREP" HeaderText="Acto Administrativo" PropertyName="ActoAdministrativo" >
            @context.IDMOTIVOADMINISTRATIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION
        </GridColumn>
@*         <GridColumn TItem="ACTOSADMINPREP" HeaderText="Motivo Administrativo" PropertyName="IDMOTIVOADMINISTRATIVONavigation">
            @context.DESCRIPCION.ToString()
        </GridColumn>
        <GridColumn TItem="ACTOSADMINPREP" HeaderText="Acto Administrativo" PropertyName="IDMOTIVOADMINISTRATIVONavigation">
            @context.TIPMOT.ToString()
        </GridColumn> *@
    </GridColumns> 
</Grid>

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

    // Lista de datos de ejemplo
    private List<ACTOSADMINPREP> actosAdministrativos = new List<ACTOSADMINPREP>();

    protected override async Task OnInitializedAsync()
    {

        if (Persona?.IDPERSONA != null && Persona.IDPERSONA > 0)
        {
            await CargarActosAdministrativos();
        }
        else
        {
            Console.WriteLine("Persona no está completamente cargada.");
        }
    }
    private async Task CargarActosAdministrativos()
    {
        try
        {
            // Recuperar el token del estado de usuario o cookies
            var token = UserState.Token;

            if (string.IsNullOrEmpty(token))
            {
                Console.WriteLine("Token no encontrado.");
                return;
            }

            var client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger());
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // Crear filtro para IDPERSONAL
            Expression<Func<ACTOSADMINPREP, bool>> filtro = x => x.IDPERSONA == Persona.IDPERSONA;

            var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
            var serializedExpression = serializer.SerializeText(filtro);

            var jsonContent = JsonConvert.SerializeObject(new { Expression = serializedExpression });
            var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");

            // Llamar al método Filtrar
            var response = await client.PostAsync("/api/ACTOSADMINPREP/filtrar", content);

            if (response.IsSuccessStatusCode)
            {
                var resultContent = await response.Content.ReadAsStringAsync();
                actosAdministrativos = JsonConvert.DeserializeObject<List<ACTOSADMINPREP>>(resultContent) ?? new List<ACTOSADMINPREP>();
            }
            else
            {
                Console.WriteLine($"Error al cargar Vida Administrativa: {response.StatusCode}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar Vida Administrativa: {ex.Message}");
        }
    }
    private void nuevoActoAdministrativo()
    {
        var nuevaUrl = GenerarLink(null,Persona?.IDPERSONA);
        NavigationManager.NavigateTo(nuevaUrl, forceLoad:true);
    }
    private string GenerarLink(int? idActo,int? idPersona)
    {
        var ia = tsUtilidades.crypt.FEncS(idActo?.ToString() ?? "0",
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            875421649);

        string per = string.Empty;

        if (idPersona.HasValue)
        {
            per = tsUtilidades.crypt.FEncS(idPersona.ToString(),
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                875421649);
        }
        if (!string.IsNullOrEmpty(ia))
        {
            return $"/infoActoAdministrativo?ia={ia}&per={per}";
        }
        else
        {
            return $"/infoActoAdministrativo?per={per}";
        }
    }
    private async Task btnExportarPDF()
    {
        var itm = actosAdministrativos
      .Select(f => new
      {
          Descripción = f.DESCRIPCION,
          Fecha = f.FECHA?.ToString("dd/MM/yyyy"),
          Motivo_Administrativo = f.IDMOTIVOADMINISTRATIVONavigation?.DESCRIPCION,
          Acto_Administrativo = f.IDMOTIVOADMINISTRATIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION,
         
      })
      .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,
        $"ActosAdministrativos_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = actosAdministrativos
    .Select(f => new
    {
        Descripción = f.DESCRIPCION,
        Fecha = f.FECHA?.ToString("dd/MM/yyyy"),
        Motivo_Administrativo = f.IDMOTIVOADMINISTRATIVONavigation?.DESCRIPCION,
        Acto_Administrativo = f.IDMOTIVOADMINISTRATIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION,

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