@page "/GenNominas"

@using BlazorBootstrap
@using Newtonsoft.Json
@using GestionPersonalWeb.Components.Layout
@using Microsoft.AspNetCore.WebUtilities
@using GestionPersonalWeb.Components.Pages.InfoPersComponents
@using GestionPersonalWeb.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation

<div class="mt-3">
    
    <div class="row">
        <div class="col-md-6">
            <label class="fw-bold">Mes a Generar: </label>
            <InputSelect @bind-Value="IDNOMINASEL" @bind-Value:after="CargarPersonas">
                <option value="0">-</option> 
                @foreach (var nom in listNoms)
                {
                    <option value="@nom.IDNOMINAS">@nom.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-2"></div>
        <div class="col-md-4">
            <input type="button" value="Generar Nómina" onclick="@GenerarNomina" />
        </div>
    </div>
    <div style=" max-height:400px;overflow-y:auto">
        <div style="overflow-x:auto;" class="tablaDesk">
            <Grid TItem="PERSONAS"
                  Class="table tablaRegPers"
                  Data="listPersonas"
                  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="PERSONAS" HeaderText="Generar" FilterButtonCSSClass="hidden">
                        <input class="chbGenNom" value="@context.IDPERSONA" type="checkbox" checked="@Seleccionados.Contains(context.IDPERSONA)"
                               @onchange="e => Toggle(context.IDPERSONA, (bool)e.Value!)" />
                    </GridColumn>
                    <GridColumn TItem="PERSONAS" HeaderText="N.I.F." PropertyName="NIF" TextNoWrap="true" FilterButtonCSSClass="hidden" SortKeySelector="item => item.NIF">
                        @context.NIF
                    </GridColumn>
                    <GridColumn TItem="PERSONAS" HeaderText="Nombre Completo" PropertyName="ApellidosNombre" FilterButtonCSSClass="hidden" SortKeySelector="item => item.APELLIDOSNOMBRE">
                        @context.APELLIDOSNOMBRE
                    </GridColumn>
                    <GridColumn TItem="PERSONAS" HeaderText="Tipo" PropertyName="Cuerpo" TextNoWrap="true" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDCUERPORPTNavigation.DESCRIPCION">
                        @context.IDCUERPORPTNavigation?.DESCRIPCION
                    </GridColumn>
                    <GridColumn TItem="PERSONAS" HeaderText="Fecha Alta" PropertyName="FechaAltaPAR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHAALTAPAR">
                        @context.FECHAALTAPAR
                    </GridColumn>
                    <GridColumn TItem="PERSONAS" HeaderText="Fecha Baja" PropertyName="FechaBajaPAR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHABAJAPAR">
                        @context.FECHABAJAPAR
                    </GridColumn>
                </GridColumns>
            </Grid>
        </div>
    </div>
    <div style=" max-height:400px;overflow-y:auto">
        <div style="overflow-x:auto;" class="tablaDesk">
            <Grid TItem="NOMINATRABAJADORCABECERA"
                  Class="table tablaRegPers"
                  Data="listNomGen"
                  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="NOMINATRABAJADORCABECERA" HeaderText="Nombre" PropertyName="ApellidosNombre" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDPERSONANavigation.APELLIDOSNOMBRE">
                        @context.IDPERSONANavigation.APELLIDOSNOMBRE
                    </GridColumn>
                    <GridColumn TItem="NOMINATRABAJADORCABECERA" HeaderText="Nombre" PropertyName="ApellidosNombre" FilterButtonCSSClass="hidden" SortKeySelector="item => item.">
                        @context.IDPERSONANavigation.APELLIDOSNOMBRE
                    </GridColumn> *@
                   @*  <GridColumn TItem="NOMINATRABAJADORLINEA" HeaderText="Nombre" PropertyName="ApellidosNombre" FilterButtonCSSClass="hidden" SortKeySelector="item => item.tramo">
                         @context.CODIGO
                    </GridColumn> *@
                </GridColumns>
            </Grid>
        </div>
    </div>
</div>



@code {
    // pruebaagu

    List<int> Seleccionados = new();

    private List<NOMINAS> listNoms = new List<NOMINAS>();
    private int IDNOMINASEL { get; set; }
    private List<int> listaUsus = new List<int>();
    private List<PERSONAS> listPersonas = new List<PERSONAS>();
    private List<NOMINATRABAJADORCABECERA> listNomGen = new List<NOMINATRABAJADORCABECERA>();
    protected override async Task OnInitializedAsync()
    {
        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();
        var nominas = JsonConvert.DeserializeObject<List<NOMINAS>>(resultContent)
                   ?? new List<NOMINAS>();

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

        listNoms = nominas;
    }


    void Toggle(int id, bool value)
    {
        if (value) Seleccionados.Add(id);
        else Seleccionados.Remove(id);
        Console.WriteLine(id);
        StateHasChanged();
    }



    protected async void CargarPersonas()
    {
        Seleccionados.Clear();
        var idnom = IDNOMINASEL;
        NOMINAS nomAct = listNoms.FirstOrDefault(x => x.IDNOMINAS == IDNOMINASEL);
        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"));
        List<PERSONAS> persi = new List<PERSONAS>();
        Expression < Func<PERSONAS, bool> > filtroPers3 = x => x.FECHABAJA.HasValue == false && x.FECHAALTA.HasValue;
        persi = await Utilidades.ObtenerObjeto<List<PERSONAS>>(client, "/api/PERSONAS/filtrar", filtroPers3);
        Expression<Func<INCIDENCIAS, bool>> filtroPersi = x => (x.ESDELIQUIDACION == false && x.IDNOMINA == idnom) || (x.MESNOMINA == nomAct.MES && x.AÑONOMINA == nomAct.AÑO && x.NOMINASEGURIDADSOCIAL == true && x.ESDELIQUIDACION == false && nomAct.IDTIPONavigation.DESCRIPCION.Trim() == "SEGURIDAD SOCIAL"); 
        List<INCIDENCIAS> Incipersi = await Utilidades.ObtenerObjeto<List<INCIDENCIAS>>(client, "/api/INCIDENCIAS/filtrar", filtroPersi);
      
        if (Incipersi != null && Incipersi.Count > 0)
        {
            foreach (INCIDENCIAS inci in Incipersi)
            {
                if (persi.Any(x=>x.IDPERSONA == inci.IDPERSONANavigation.IDPERSONA)==false){
                    persi.Add(inci.IDPERSONANavigation);
                }
            };
        }
        Expression<Func<PERSONAS, bool>> filtroPers = x => x.FECHABAJA.HasValue && (x.FECHABAJA >= nomAct.FECHAINICIO && x.FECHABAJA <= nomAct.FECHAFIN);
        List<PERSONAS> pers = await Utilidades.ObtenerObjeto<List<PERSONAS>>(client, "/api/PERSONAS/filtrar", filtroPers);
        if (pers != null && pers.Count > 0)
        {
            foreach (PERSONAS inci in pers)
            {
                if (persi.Any(x => x.IDPERSONA == inci.IDPERSONA) == false)
                {
                    persi.Add(inci);
                }
            };
        }
        var fechaFin = nomAct.FECHAINICIO.Value.AddDays(-1);
        Expression<Func<PERSONAS, bool>> filtroPers2 = x => x.FECHABAJA.HasValue && (x.FECHABAJA == fechaFin);
        List<PERSONAS> DipFinLeg = await Utilidades.ObtenerObjeto<List<PERSONAS>>(client, "/api/PERSONAS/filtrar", filtroPers2);


        if (DipFinLeg != null && DipFinLeg.Count > 0)
        {
            foreach (PERSONAS inci in DipFinLeg)
            {
                if (persi.Any(x => x.IDPERSONA == inci.IDPERSONA) == false)
                {
                    persi.Add(inci);
                }
            };
        }

        listPersonas = persi;


        listPersonas = listPersonas
            .OrderBy(x => x.APELLIDOS)
            .ThenBy(x => x.NOMBRE)
            .ThenByDescending(x => x.FECHAALTA)
            .ToList();
        StateHasChanged();
    }
    protected async void GenerarNomina()
    {
        DatGenNom objetoConsulta = new DatGenNom();

        try
        {
            if (Seleccionados.Count > 0)
            {

                objetoConsulta.Personas = Seleccionados;
                objetoConsulta.Idnomina = IDNOMINASEL;

                var token = UserState.Token;
                var client = HttpClientFactory.CreateClient();
                client.BaseAddress = new Uri(Utilidades.urlSwagger2());
                // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var response = await client.PostAsJsonAsync("/api/GeneraNominas", objetoConsulta);

                var content = await response.Content.ReadAsStringAsync();

                var resultado = JsonConvert.DeserializeObject<ResultadoGenerarNomina>(content);
                if(resultado.Resultado == 0)
                {
                    Console.WriteLine(resultado.NumNomGen);
                }

            }
        }
        catch (Exception e)
        {

            Console.WriteLine($"Error al obtener los datos: {e.Message}");

        }


    }
}
