@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
@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" @onclick="btnExportarExcel">Exportar Excel</button>
        <button class="btnOAAFAzul" @onclick="btnExportarPDF">Exportar PDF</button>
    </div>
    <button class="btnOAAFAzul d-flex align-items-center" @onclick="NuevaVidaAdministrativa">
        <i class="icono-nuevo"></i> Nueva vida administrativa
    </button>
</div>

<Grid TItem="VIDA_ADMINISTRATIVA"
      Class="table tablaRegPers"
      Data="vidaAdministrativaItems"
      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="VIDA_ADMINISTRATIVA" HeaderText="Tiene Documentos" PropertyName="NUM_REG" SortKeySelector="x => x.TIENELINEAS">
            @if (context.TIENELINEAS == true)
            {<i class="fa-regular fa-square-check"></i>}
            else{}
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Actos Administrativos" SortKeySelector="x => x.IDMOTIVONavigation.IDTIPOAPTOSNavigation.DESCRIPCION">
            @if(TiposActos.Count > 0){
            <a href="@GenerarLink(context.IDVIDA, Persona?.IDPERSONA)">@TiposActos?.FirstOrDefault(x => x.IDTIPO == context.IDMOTIVONavigation?.IDTIPOAPTOSNavigation?.IDTIPO)?.DESCRIPCION</a>
            }
        </GridColumn>
       @*  <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Unidad Administrativa" PropertyName="IDUNIDADADMINISTRATIVANavigation">
            @context.IDUNIDADADMINISTRATIVANavigation?.LITERAL_DEPARTAMENTO
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Servicio Adscrito" PropertyName="IDSERVICIOADSCRITONavigation">
            @context.IDSERVICIOADSCRITONavigation?.DESCRIPCION
        </GridColumn> *@
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Departamento" PropertyName="DEPARTAMENTO" SortKeySelector="x => x.IDPUESTONavigation.IDRPTDESNavigation.IDDEPARTAMENTONavigation.DESCRIPCION">
            @context.IDPUESTONavigation?.IDRPTDESNavigation?.IDDEPARTAMENTONavigation.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Causa" PropertyName="CAUSA" SortKeySelector="x => x.CAUSA">
            @context.CAUSA
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Observaciones" PropertyName="OBSERVACIONES" SortKeySelector="x => x.OBSERVACIONES">@context.OBSERVACIONES</GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Descripción" PropertyName="Descripcion" SortKeySelector="x => x.DENOMINACION_OLD">@context.DENOMINACION_OLD</GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Fecha Efecto" PropertyName="FECHA" SortKeySelector="x => x.FECHA">
            @context.FECHA?.ToShortDateString()
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Fecha Resolución" PropertyName="FECHARESOLUCION" SortKeySelector="x => x.FECHARESOLUCION">
            @context.FECHARESOLUCION?.ToShortDateString()
        </GridColumn>
        <GridColumn TItem="VIDA_ADMINISTRATIVA" HeaderText="Caracter Ocupación" PropertyName="OCUPACION_OLDNavigation" SortKeySelector="x => x.OCUPACION_OLDNavigation.DESCRIPCION">
            @context.OCUPACION_OLDNavigation?.DESCRIPCION       
            </GridColumn>
    </GridColumns>
</Grid>

@code {
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();
    private List<TIPOAPTOSADMINISTRATIVOS> TiposActos = new List<TIPOAPTOSADMINISTRATIVOS>();
    private List<VIDA_ADMINISTRATIVA> vidaAdministrativaItems = new();
    protected override async Task OnInitializedAsync()
    {
        if (Persona?.IDPERSONA != null && Persona.IDPERSONA > 0)
        {
            await CargarVidaAdministrativa();
        }
        else
        {
            Console.WriteLine("Persona no está completamente cargada.");
        }
    }
    private async Task CargarVidaAdministrativa()
    {
        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<VIDA_ADMINISTRATIVA, bool>> filtro = x => x.IDPERSONAL == 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/VIDA_ADMINISTRATIVA/filtrar", content);            
            if (response.IsSuccessStatusCode)
            {
                var resultContent = await response.Content.ReadAsStringAsync();
                vidaAdministrativaItems = JsonConvert.DeserializeObject<List<VIDA_ADMINISTRATIVA>>(resultContent) ?? new List<VIDA_ADMINISTRATIVA>();
              vidaAdministrativaItems =  vidaAdministrativaItems.OrderByDescending(x => x.FECHA).ThenBy(x => x.NUM_REG).ThenBy(x => x.IDMOTIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION).ThenBy(x => x.IDVIDA).ToList();
            }
            else
            {
                Console.WriteLine($"Error al cargar Vida Administrativa: {response.StatusCode}");
            }
            var TiApAd = await client.GetAsync("/api/TIPOAPTOSADMINISTRATIVOS");
            var TiApAdContent = await TiApAd.Content.ReadAsStringAsync();
            if (TiApAd.IsSuccessStatusCode) { TiposActos = JsonConvert.DeserializeObject<List<TIPOAPTOSADMINISTRATIVOS>>(TiApAdContent) ?? new List<TIPOAPTOSADMINISTRATIVOS>(); }
            TiposActos = TiposActos?.OrderBy(x => x.DESCRIPCION).ToList() ?? new List<TIPOAPTOSADMINISTRATIVOS>();

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar Vida Administrativa: {ex.Message}");
        }
    }
    private string GenerarLink(int? idVida, int? idPersona)
    {
        var iv = tsUtilidades.crypt.FEncS(idVida?.ToString() ?? "0", 
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 
            875421649);

        string uv = string.Empty;

        if (idPersona.HasValue)
        {
            uv = tsUtilidades.crypt.FEncS(idPersona.ToString(), 
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 
                875421649);
        }

        // Construir el enlace basado en los parámetros
        if (!string.IsNullOrEmpty(uv))
        {
            return $"/infoVidaAdministrativa?iv={iv}&uv={uv}";
        }
        else
        {
            return $"/infoVidaAdministrativa?iv={iv}";
        }
    }
    private void NuevaVidaAdministrativa()
    {
        var nuevaUrl = GenerarLink(0, Persona?.IDPERSONA);
        NavigationManager.NavigateTo(nuevaUrl, forceLoad:true);
    }
    
    private async Task btnExportarPDF()
    {
        var itm = vidaAdministrativaItems
      .Select(f => new
      {
          Actos_Administrativos = TiposActos?.FirstOrDefault(x => x.IDTIPO == f.IDMOTIVONavigation?.IDTIPOAPTOSNavigation?.IDTIPO)?.DESCRIPCION,
          Departamento = f.IDPUESTONavigation?.IDRPTDESNavigation?.IDDEPARTAMENTONavigation?.DESCRIPCION,
          Causa = f.CAUSA,
          Observaciones = f.OBSERVACIONES,
          Descripción = f.DENOMINACION_OLD,
          Fecha_Efecto = f.FECHA,
          Fecha_Resolución = f.FECHARESOLUCION,
          Caracter_Ocupación = f.OCUPACION_OLDNavigation?.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,
        $"VidaAdministrativa_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = vidaAdministrativaItems
     .Select(f => new
     {
         Actos_Administrativos = TiposActos?.FirstOrDefault(x => x.IDTIPO == f.IDMOTIVONavigation?.IDTIPOAPTOSNavigation?.IDTIPO)?.DESCRIPCION,
         Departamento = f.IDPUESTONavigation?.IDRPTDESNavigation?.IDDEPARTAMENTONavigation?.DESCRIPCION,
         Causa = f.CAUSA,
         Observaciones = f.OBSERVACIONES,
         Descripción = f.DENOMINACION_OLD,
         Fecha_Efecto = f.FECHA,
         Fecha_Resolución = f.FECHARESOLUCION,
         Caracter_Ocupación = f.OCUPACION_OLDNavigation?.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,
            $"VidaAdministrativa_{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>