@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 @onclick="@(() => abrirPopupGestionDatos(new TRIENIOS()))" 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">Grupo:</label>
                <InputSelect @bind-Value="itemSeleccionado!.IDGRUPO" class="inputForm">
                    <option value="">-- Seleccione un grupo -- </option>

                    @foreach (var nvl in listadoGrupo)
                    {
                        <option value="@nvl.IDGRUPO">@nvl.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>

         
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Trienios otras administraciones:</label>
                <InputNumber  @bind-Value="itemSeleccionado!.TOA" class="inputForm"></InputNumber>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Trienios Oficina:</label>
                <InputNumber  @bind-Value="itemSeleccionado!.TC" class="inputForm"></InputNumber>
            </div>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDTRIENIO != 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="TRIENIOS"
      Class="table tablaRegPers"
      Data="trieniosItems"
      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="TRIENIOS" HeaderText="Grupo" PropertyName="Grupo" >
            @context.IDGRUPONavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="TRIENIOS" HeaderText="Trienios otras administraciones" PropertyName="TrieniosOtrasAdministraciones" >
            @context.TOA
        </GridColumn>

        <GridColumn TItem="TRIENIOS" HeaderText="Trienios Oficina" PropertyName="TrieniosParlamento">
            @context.TC
        </GridColumn>
        <GridColumn TItem="bdAntifraude.db.TRIENIOS" 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 EventCallback OnPersonaActualizada { get; set; }
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();
    private List<TRIENIOS> trieniosItems = new();
    private HttpClient cliente = new HttpClient();
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;
    private string tituloPopup = "";
    private TRIENIOS itemSeleccionado = new TRIENIOS();
    private List<GRUPO> listadoGrupo = new List<GRUPO>();
    List<ToastMessage> mensajes = new List<ToastMessage>();

    protected override async Task OnInitializedAsync()
    {
        try
        {

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

            if (Persona?.IDPERSONA != null && Persona!.IDPERSONA > 0)
            {
                await ObtenerLista();
                await rellenarListado();
            }
            else
            {
                Console.WriteLine("Persona no está completamente cargada.");
            }

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

            listadoGrupo =  await Utilidades.ObtenerObjeto<List<GRUPO>>(cliente, "/api/GRUPO");
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task abrirPopupGestionDatos(TRIENIOS objeto)
    {
        itemSeleccionado = objeto;

        if (itemSeleccionado.IDTRIENIO != 0)
        {
            tituloPopup = "Modificar Trienio";
        }
        else
        {
            tituloPopup = "Nuevo Trienio";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONAL = Persona.IDPERSONA;
        switch (accion)
        {
            case "update":
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/TRIENIOS/" + itemSeleccionado.IDTRIENIO, itemSeleccionado);
                await cerrarPopupGestionDatos();

                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Actualizado correctamente.",
                    });

                break;

            case "create":
                var response = await Utilidades.NuevoObjeto(cliente, "/api/TRIENIOS", itemSeleccionado);
                await cerrarPopupGestionDatos();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/TRIENIOS/" + itemSeleccionado.IDTRIENIO);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        await ObtenerLista();
        await InvokeAsync(StateHasChanged);
        if (OnPersonaActualizada.HasDelegate)
            await OnPersonaActualizada.InvokeAsync();
        
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    private async Task abrirPopupConfirmarBorrado(TRIENIOS objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
    private async Task btnExportarPDF()
    {
        var itm = trieniosItems
      .Select(f => new
      {
          Grupo = f.IDGRUPONavigation?.DESCRIPCION,
          Trienios_otras_administraciones = f.TOA,
          Trienios_oficina = f.TC,         
      })
      .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,
        $"Trienios_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = trieniosItems
      .Select(f => new
      {
      Grupo = f.IDGRUPONavigation?.DESCRIPCION,
      Trienios_otras_administraciones = f.TOA,
      Trienios_oficina = f.TC,
      })
      .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,
           $"Trienios_{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>