@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
@using tsDocumentos

@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 FAMILIA()))" class="btnOAAFAzul d-flex align-items-center"> <i class="icono-nuevo"></i> Nuevo </Button>
</div>

<!-- Grid de BlazorBootstrap -->
<Grid TItem="FAMILIA"
      Class="table tablaRegPers"
      Data="familiaItems"
      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="FAMILIA" HeaderText="DNI" PropertyName="DNI">
            @context.DNI
        </GridColumn>
        <GridColumn TItem="FAMILIA" HeaderText="Nombre" PropertyName="Nombre">
            @context.NOMBRE
        </GridColumn>
        <GridColumn TItem="FAMILIA" HeaderText="Apellidos" PropertyName="Apellidos">
            @context.APELLIDOS
        </GridColumn>
        <GridColumn TItem="FAMILIA" HeaderText="Fecha de Nacimiento" PropertyName="FechaNacimiento">
            @context.FECHANACIMIENTO?.ToString("dd/MM/yyyy")
        </GridColumn>
        <GridColumn TItem="FAMILIA" HeaderText="Parentesco" PropertyName="Parentesco">
            @context.IDPARENTESCONavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="FAMILIA" 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>

<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">DNI:</label>
                <InputText required @bind-Value="itemSeleccionado.DNI" class="inputForm" maxlength="9"></InputText>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Nombre:</label>
                <InputText required @bind-Value="itemSeleccionado.NOMBRE" class="inputForm" maxlength="50"></InputText>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Apellidos:</label>
                <InputText required @bind-Value="itemSeleccionado.APELLIDOS" class="inputForm" maxlength="100"></InputText>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Fecha Nacimiento:</label>
                <InputDate required @bind-Value="itemSeleccionado.FECHANACIMIENTO" class="inputForm"></InputDate>
            </div>
            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Parentesco:</label>
                <InputSelect @bind-Value="itemSeleccionado.IDPARENTESCO" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.IDPARENTESCO))" class="inputForm">

                    <option value="">-- Seleccione un parentesco -- </option>

                    @foreach (var gru in listaParentescos)
                    {
                        <option value="@gru.IDENUMERACION">@gru.DESCRIPCION</option>
                    }
                </InputSelect>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.IDPARENTESCO))</div>

            </div>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDFAMILIA != 0)
        {
            <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<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>


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

    private List<FAMILIA> familiaItems = new();
    private HttpClient cliente = new HttpClient();

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

    private FAMILIA itemSeleccionado = new FAMILIA();
    private int idItem = 0;
    List<ToastMessage> mensajes = new List<ToastMessage>();

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;

    private List<ENUMERACIONES> listaParentescos = new List<ENUMERACIONES>();

    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}");
        }
    }
    protected override async Task OnInitializedAsync()
    {
        if (Persona?.IDPERSONA != null && Persona.IDPERSONA > 0)
        {
            await CargarFamilia();
        }
        else
        {
            Console.WriteLine("Persona no está completamente cargada.");
        }
    }
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(itemSeleccionado, fieldName);

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

                if (!string.IsNullOrEmpty(value))
                {

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

        messageStore?.Clear(field);



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



        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.IDPARENTESCO }, nameof(itemSeleccionado.IDPARENTESCO));
    }
    private async Task CargarFamilia()
    {
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        await ObtenerLista();
        Expression<Func<GRUPOSENUMERACIONES, bool>> filtroGPar = x => x.GRUPO == "PARENT";
        GRUPOSENUMERACIONES gru = await Utilidades.ObtenerObjeto<GRUPOSENUMERACIONES>(cliente, "/api/GRUPOSENUMERACIONES/filtrar-entidad", filtroGPar);
        Expression<Func<ENUMERACIONES, bool>> filtroPAr = x => x.IDGRUPOENUMERACION == gru.IDGRUPOENUMERACION;
        listaParentescos = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/filtrar", filtroPAr);
    }
    private async Task ObtenerLista()
    {
        Expression<Func<FAMILIA, bool>> filtro = x => x.IDPERSONA == Persona.IDPERSONA;
        familiaItems = await Utilidades.ObtenerObjeto<List<FAMILIA>>(cliente, "/api/FAMILIA/ParentescoExtend", filtro);
    }
    private async Task abrirPopupGestionDatos(FAMILIA objeto)
    {
        itemSeleccionado = objeto;

        if (idItem != 0)
        {
            tituloPopup = "Modificar Familia";
        }
        else
        {
            tituloPopup = "Nueva Familia";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONA = Persona.IDPERSONA;
        switch (accion)
        {
            case "update":
                if (!editContext!.GetValidationMessages().Any())
                {
                    var responsea = await Utilidades.ActualizarObjeto(cliente,"/api/FAMILIA/" + itemSeleccionado.IDFAMILIA, itemSeleccionado);
                    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/FAMILIA", itemSeleccionado);
                    await cerrarPopupGestionDatos();
                    mensajes.Add(new ToastMessage
                        {
                            Type = ToastType.Primary,
                            Message = $"Guardado correctamente.",
                        });
                }
                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/FAMILIA/" + itemSeleccionado.IDFAMILIA);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        await ObtenerLista();
        await InvokeAsync(StateHasChanged);
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    private async Task abrirPopupConfirmarBorrado(FAMILIA objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }

    private async Task btnExportarPDF()
    {
        var familiaEnviar = familiaItems
            .Select(f => new
            {
                f.DNI,
                Nombre = f.NOMBRE,
                Apellidos = f.APELLIDOS,
                Fecha_Nacimiento = f.FECHANACIMIENTO?.ToString("dd/MM/yyyy") ?? "",
                Parentesco = f.IDPARENTESCONavigation?.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,
            familiaEnviar,
            logoBytes,
            pdfHeaderColor,
            $"Familia_{Persona.APELLIDOS}_{Persona.NOMBRE}.pdf");
    }
    private async Task btnExportarExcel()
    {
        // 1) Proyecta solo las columnas que quieres
        var familiaEnviar = familiaItems
            .Select(f => new
            {
                f.DNI,
                Nombre = f.NOMBRE,
                Apellidos = f.APELLIDOS,
                Fecha_Nacimiento = f.FECHANACIMIENTO?.ToString("dd/MM/yyyy") ?? "",
                Parentesco = f.IDPARENTESCONavigation?.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,
            familiaEnviar,
            logoBytes,
            excelHeaderColor,
            $"Familia_{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>

