@page "/Nominas"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components

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

<div class="pagina">
    <div class="Cabecera">
        <h6><small><i class="fas fa-user"></i><b> Nóminas</b></small></h6>
    </div>

    @if (nominas == null)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingImg"></div>
        </div>
    }
    else if (!nominas.Any())
    {
        <p>No se encontraron datos para mostrar.</p>
    }
    else
    {
        <div class="botonera col-12 gap-1" style="display:flex;" role="group">
            @*    <button type="button" class="btnOAAFBlack" id="btnNuevaPers" title="Añadir nueva persona" @onclick="NuevaPersona">
        <i class="fa-solid fa-user-plus"></i>
        </button> *@
            @*    <button type="button" class="btnOAAFBlack" @onclick="btnExportarExcel" id="btnExportarExcel" title="Exportar excel">
        <i class="fa-solid fa-file-export"></i>
        </button>
        <!-- Botón "Ver Todos" con toggle: se asigna btnOAAFAzul cuando está activo -->
        <button type="button" id="btnVerTodos" @onclick="ToggleVerTodos" title="alternar entre ver personas activas y todas" class="@(verTodosActive ? "btnOAAFAzul" : "btnOAAFBlack")">
        <i class="fa-solid fa-eye"></i> Ver Todos
        </button> *@
            @*    <button type="button" class="btnOAAFBlack" title="listado de personas que cumplen trienio" id="btnCumplimientoTrienios" onclick="window.location.href='/cumplimientoTrienios'">
        <i class="fa-solid fa-hourglass-end"></i> Cumplimiento Trienios
        </button> *@
        </div>
        <div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
        <div class="form-group mt-4 mb-4">
            <input class="form-control" type="text" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:event="oninput" />
        </div>

        <!-- Grid con paginación manual: se muestran los datos de la página actual -->

        <Accordion>
        @for(var y=0; y <= annos.Count-1; y++)
        {
                var listado = listnominas.Where(x => x.AÑO == annos[y]).ToList();
                <AccordionItem Title="@annos[y].ToString()">
                <Content>
                     <div style="overflow-x:auto;" class="tablaDesk">
            <Grid TItem="NOMINAS"
                  Class="table tablaRegPers"
                  Data="@listado"
                  AllowFiltering="false"
                  AllowPaging="false"
                  AllowSorting="true"
                  EmptyText="No se han encontrado datos"
                  Height="80"
                  PageSizeSelectorVisible="false"
                  Responsive="true"
                  PaginationItemsTextFormat="{0} - {1} de {2} elementos">
                <GridColumns>
                    <GridColumn TItem="NOMINAS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden">
                                        <NavLink class="btn btn-link" href="@HashRed(context.IDNOMINAS.ToString())">@context.DESCRIPCION</NavLink>
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Año" PropertyName="AÑO" FilterButtonCSSClass="hidden">
                        @context.AÑO
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Mes" PropertyName="MES" FilterButtonCSSClass="hidden">
                        @context.MES
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Tipo" PropertyName="IDTIPONavigation.DESCRIPCION" FilterButtonCSSClass="hidden">
                        @context.IDTIPONavigation.DESCRIPCION
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Fecha Inicio" PropertyName="FECHAINICIO" FilterButtonCSSClass="hidden">
                        @context.FECHAINICIO?.ToShortDateString()
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Fecha Pago" PropertyName="FECHAPAGO" FilterButtonCSSClass="hidden">
                        @context.FECHAPAGO?.ToShortDateString()
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Número Días Laborales" PropertyName="NUMERODIASLABORALES" FilterButtonCSSClass="hidden">
                        @context.NUMERODIASLABORABLES
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Número Días Festivos" PropertyName="NUMERODIASFESTIVOS" FilterButtonCSSClass="hidden">
                        @context.NUMERODIASFESTIVOS
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Paga Extra" PropertyName="PAGAEXTRA" FilterButtonCSSClass="hidden">
                        @if (context.PAGAEXTRA== true)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                        else { }
                    </GridColumn>
                    <GridColumn TItem="NOMINAS" HeaderText="Situación" PropertyName="IDSITUACIONNOMINANavigation.DESCRIPCION" FilterButtonCSSClass="hidden">
                        @context.IDSITUACIONNOMINANavigation.DESCRIPCION
                    </GridColumn>
                </GridColumns>
             
            </Grid>
                        </div>
                </Content>
            </AccordionItem>
        }
        </Accordion>
       
     
    }
</div>

@code {
    private List<NOMINAS> listnominas = new List<NOMINAS>();
    private List<NOMINAS> nominas = new List<NOMINAS>();
    private List<int> annos = new List<int>();
    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private string HashRed(string id)
    {
        string link = "/InfoNominas?cl=" + tsUtilidades.crypt.FEncS(
            id,
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            875421649);
        return link;
    }
    // Bandera que indica si se está en modo "Ver Todos"
    private bool verTodosActive = false;
    /// <summary>
    /// Método toggle que cambia entre mostrar todos los registros y solo activos.
    /// </summary>
    private async Task ToggleVerTodos()
    {
        if (!verTodosActive)
        {
            verTodosActive = true;
            var token = UserState.Token;
            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"));

            var resultPersonas = await client.GetAsync("/PERSONAS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            nominas = JsonConvert.DeserializeObject<List<NOMINAS>>(resultContent)
                       ?? new List<NOMINAS>();
        }
        else
        {
            verTodosActive = false;
            var token = UserState.Token;
            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"));

            var resultPersonas = await client.GetAsync("/api/PERSONAS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            nominas = JsonConvert.DeserializeObject<List<NOMINAS>>(resultContent)
                       ?? new List<NOMINAS>();
        }

        nominas = nominas
            .OrderByDescending(x => x.FECHAINICIO)
            .ThenBy(x => x.DESCRIPCION)
            .ToList();

        listnominas = nominas;
        UserState.CurrentPage = 1;
        Filter = "";
    }
    private void AplicarFiltros()
    {
        listnominas = nominas.Where(per =>
            string.IsNullOrEmpty(Filter) ||
            Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.AÑO.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.MES.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.IDTIPONavigation.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.FECHAINICIO.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.FECHAPAGO.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.NUMERODIASLABORABLES.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.NUMERODIASFESTIVOS.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.IDSITUACIONNOMINANavigation.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
        ).ToList();
        UserState.CurrentPage = 1;
    }
    /// <summary>
    /// Retorna un subconjunto de páginas alrededor de la página actual (±2 páginas).
    /// </summary>
    // private IEnumerable<int> PageNumbersToDisplay()
    // {
    //     int range = 2;
    //     int startPage = Math.Max(1, UserState.CurrentPage - range);
    //     int endPage = Math.Min(TotalPaginas, UserState.CurrentPage + range);

    //     for (int i = startPage; i <= endPage; i++)
    //     {
    //         yield return i;
    //     }
    // }
    /// <summary>
    /// Formatea el nombre de la persona insertando un salto de línea después de la segunda palabra.
    /// </summary>
    /// <param name="nombre">Nombre a formatear</param>
    /// <returns>MarkupString con el nombre formateado</returns>
    private MarkupString FormatearNombre(string nombre)
    {
        if (string.IsNullOrEmpty(nombre))
        {
            return new MarkupString(string.Empty);
        }
        var palabras = nombre.Split(' ');
        if (palabras.Length > 2)
        {
            string primeraParte = string.Join(" ", palabras.Take(2));
            string resto = string.Join(" ", palabras.Skip(2));
            return new MarkupString($"{primeraParte}<br/>{resto}");
        }
        return new MarkupString(nombre);
    }
    protected override async Task OnInitializedAsync()
    {
        verTodosActive = false;
        var token = UserState.Token;
        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"));

        var resultPersonas = await client.GetAsync("/api/NOMINAS");
        var resultContent = await resultPersonas.Content.ReadAsStringAsync();
        nominas = JsonConvert.DeserializeObject<List<NOMINAS>>(resultContent)
                   ?? new List<NOMINAS>();

        nominas = nominas
            .OrderByDescending(x => x.FECHAINICIO)
            .ThenBy(x => x.DESCRIPCION)
            // .ThenByDescending(x => x.FECHAALTA)
            .ToList();

        listnominas = nominas;

        for (var i = 0; i < nominas.Count; i++)
        {
            if (annos.Contains(nominas[i].AÑO) == false)
            {
                annos.Add(nominas[i].AÑO);
            }
        }
        
    }
    private async Task btnExportarPDF()
    {
        var itm = listnominas
      .Select(f => new
      {
          Descripción = f.DESCRIPCION,
          Año = f.AÑO,
          Mes = f.MES,
          Tipo = f.IDTIPONavigation.DESCRIPCION,
          Fecha_Inicio = f.FECHAINICIO,
          Fecha_Pago = f.FECHAPAGO,
          Número_Días_Laborales = f.NUMERODIASLABORABLES,
          Número_Días_Festivos = f.NUMERODIASFESTIVOS,
          Paga_Extra = f.PAGAEXTRA,
          Situación = f.IDSITUACIONNOMINANavigation.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,
        $"Personas.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = listnominas
     .Select(f => new
     {
         Descripción = f.DESCRIPCION,
         Año = f.AÑO,
         Mes = f.MES,
         Tipo = f.IDTIPONavigation.DESCRIPCION,
         Fecha_Inicio = f.FECHAINICIO,
         Fecha_Pago = f.FECHAPAGO,
         Número_Días_Laborales = f.NUMERODIASLABORABLES,
         Número_Días_Festivos = f.NUMERODIASFESTIVOS,
         Paga_Extra = f.PAGAEXTRA,
         Situación = f.IDSITUACIONNOMINANavigation.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,
            $"Personas.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>