@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
@rendermode InteractiveServer

@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 CONSOLIDACION_GRADO()))" 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">Fecha Efecto:</label>
                <InputDate required @bind-Value="itemSeleccionado.FECHA_EFECTO" class="inputForm"></InputDate>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha Resolución:</label>
                <InputDate required @bind-Value="itemSeleccionado.FECHA_RESOLUCION" class="inputForm"></InputDate>
            </div>
            <div class="col-12 formatoCampos">

            <label class="tituloLbl">Nivel:</label>
                <InputSelect @bind-Value="itemSeleccionado!.IDNIVEL" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.IDNIVEL))" class="inputForm">
                <option value="">-- Seleccione un nivel -- </option>

                @foreach (var nvl in listadoNvls)
                {
                    <option value="@nvl.IDNIVEL">@nvl.DESCRIPCION</option>
                }
            </InputSelect>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.IDNIVEL))</div>

            </div>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDCUMPGRADO != 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="CONSOLIDACION_GRADO"
      Class="table tablaRegPers"
      Data="consoGradoItems"
      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="CONSOLIDACION_GRADO" HeaderText="Nivel" PropertyName="Nivel" >
            @context?.IDNIVELNavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="CONSOLIDACION_GRADO" HeaderText="Fecha Efecto" PropertyName="FechaEfecto">
            @context?.FECHA_EFECTO?.ToShortDateString()
        </GridColumn>
        <GridColumn TItem="CONSOLIDACION_GRADO" HeaderText="Fecha Resolución" PropertyName="FechaResolucion">
            @context?.FECHA_RESOLUCION?.ToShortDateString()
        </GridColumn>
        <GridColumn TItem="bdAntifraude.db.CONSOLIDACION_GRADO" 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();

    // nuevo callback
    [Parameter]
    public EventCallback OnPersonaActualizada { get; set; }

    private List<CONSOLIDACION_GRADO> consoGradoItems = new ();
    private HttpClient cliente = new HttpClient();

    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;
    private string tituloPopup = "";

    private CONSOLIDACION_GRADO itemSeleccionado = new CONSOLIDACION_GRADO();
    private List<NIVEL> listadoNvls = new List<NIVEL>();
    List<ToastMessage> mensajes = new List<ToastMessage>();
    private EditContext? editContext;
    private ValidationMessageStore? messageStore;

    protected override void OnInitialized()
    {
        try
        {
            editContext = new EditContext(itemSeleccionado);
            messageStore = new ValidationMessageStore(editContext);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(itemSeleccionado, fieldName);

        switch (fieldName)
        {
            case nameof(itemSeleccionado.IDNIVEL):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.IDNIVEL = int.Parse(value);
                }
                else
                {
                    itemSeleccionado.IDNIVEL = 0;
                }
                break;
        }

        messageStore?.Clear(field);



        if (fieldName == nameof(itemSeleccionado.IDNIVEL) && itemSeleccionado.IDNIVEL == 0)
        {
            messageStore?.Add(field, "Seleccione un nivel.");
        }



        editContext!.NotifyValidationStateChanged();
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(itemSeleccionado, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private void ValidarItem()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.IDNIVEL }, nameof(itemSeleccionado.IDNIVEL));
    }
    protected override async Task OnParametersSetAsync()
    {
        try
        {

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

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

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellenarListadoNivel()
    {
        try
        {
            List<bdAntifraude.db.NIVEL> nvlsEncontrado = await Utilidades.ObtenerObjeto<List<bdAntifraude.db.NIVEL>>(cliente, "/api/NIVEL");
            listadoNvls = nvlsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task ObtenerLista()
    {
        consoGradoItems = await Utilidades.ObtenerObjeto<List<CONSOLIDACION_GRADO>>(cliente, "/api/CONSOLIDACION_GRADO/GetWithIncludes/" + Persona.IDPERSONA);
        if(consoGradoItems.Count > 0){
            consoGradoItems = consoGradoItems.OrderByDescending(x => x.FECHA_EFECTO).ToList();
        }
        StateHasChanged();
    }
    private async Task abrirPopupGestionDatos(CONSOLIDACION_GRADO objeto)
    {
        itemSeleccionado = objeto;

        if (itemSeleccionado.IDCUMPGRADO != 0)
        {
            tituloPopup = "Modificar Consolidación Grado";
        }
        else
        {
            tituloPopup = "Nueva Consolidación Grado";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONAL = Persona.IDPERSONA;
        var token = UserState.Token;
        if (string.IsNullOrEmpty(token))
        {
            Console.WriteLine("Token no encontrado.");
            return;
        }       
        switch (accion)
        {
            case "update":
                if (!editContext!.GetValidationMessages().Any())
                {
                    var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/CONSOLIDACION_GRADO/" + itemSeleccionado.IDCUMPGRADO, itemSeleccionado);
                    if (itemSeleccionado.FECHA_EFECTO != Persona.FECHACONSOLIDACIONGRADO)
                    {
                       await  ObtenerLista();
                        consoGradoItems = consoGradoItems.OrderByDescending(x => x.FECHA_EFECTO).ToList();
                        var grado = consoGradoItems.First();
                        Persona.FECHACONSOLIDACIONGRADO = grado.FECHA_EFECTO;
                        Persona.IDGRADOPERSONALCONSOLIDADO = grado.IDNIVEL;
                        var persAct = await Utilidades.ActualizarObjeto(cliente, "/api/PERSONAS/" + Persona.IDPERSONA, Persona);
                        StateHasChanged();
                    }
                    await cerrarPopupGestionDatos();

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

            case "create":

                ValidarItem();
                if (!editContext!.GetValidationMessages().Any())
                {
                    var response = await Utilidades.NuevoObjeto(cliente, "/api/CONSOLIDACION_GRADO", itemSeleccionado);
                    await cerrarPopupGestionDatos();
                    mensajes.Add(new ToastMessage
                        {
                            Type = ToastType.Primary,
                            Message = $"Guardado correctamente.",
                        });
                    if (itemSeleccionado.FECHA_EFECTO > Persona.FECHACONSOLIDACIONGRADO || Persona.FECHACONSOLIDACIONGRADO == null)
                    {
                        Persona.FECHACONSOLIDACIONGRADO = itemSeleccionado.FECHA_EFECTO;
                        Persona.IDGRADOPERSONALCONSOLIDADO = itemSeleccionado.IDNIVEL;
                        var persAct = await Utilidades.ActualizarObjeto(cliente, "/api/PERSONAS/" + Persona.IDPERSONA, Persona);                      
                        StateHasChanged();
                    }
                }
                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/CONSOLIDACION_GRADO/" + itemSeleccionado.IDCUMPGRADO);           
                await ObtenerLista();
                consoGradoItems = consoGradoItems.OrderByDescending(x => x.FECHA_EFECTO).ToList();
                if (consoGradoItems.Count > 0)
                {
                    var grado = consoGradoItems.First();
                    Persona.FECHACONSOLIDACIONGRADO = grado.FECHA_EFECTO;
                    Persona.IDGRADOPERSONALCONSOLIDADO = grado.IDNIVEL;
                    var persAct = await Utilidades.ActualizarObjeto(cliente, "/api/PERSONAS/" + Persona.IDPERSONA, Persona);
                    StateHasChanged();
                }
               
                  
                


                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(CONSOLIDACION_GRADO objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
     private async Task btnExportarPDF()
    {
        var itm = consoGradoItems
      .Select(f => new
      {
          Nivel = f.IDNIVELNavigation?.DESCRIPCION,
          Fecha_Efecto = f.FECHA_EFECTO?.ToShortDateString(),
          Fecha_Resolución = f.FECHA_RESOLUCION?.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,
        $"ConsolidacionGrado_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        var itm = consoGradoItems
        .Select(f => new
        {
            Nivel = f.IDNIVELNavigation?.DESCRIPCION,
            Fecha_Efecto = f.FECHA_EFECTO?.ToShortDateString(),
            Fecha_Resolución = f.FECHA_RESOLUCION?.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,
           $"ConsolidacionGrado_{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>