@page "/PeriodoSiltra"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Microsoft.AspNetCore.WebUtilities
@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> Periodo Siltra</b></small></h6>
    </div>
    <div>
        <input type="button" @onclick="GuardarPeriodoSILTRA" class="btnOAAFAzul mb-2" value="Guardar" />
    </div>
    @if (PeriodoSiltra == null)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingImg"></div>
        </div>
    }
    else
    {
        <div class="row" style="border:solid 1px black; padding:10px">
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Fecha inicio <span style="color:red">*</span>: </label>
                <input class="form-control" type="date" @bind-value="@PeriodoSiltra.FECHAINICIO" 
                @onblur="e => ValidarYActualizar(nameof(PeriodoSiltra.FECHAINICIO))" />
                <div class="validation-message">@GetExternalValidationMessage(nameof(PeriodoSiltra.FECHAINICIO))</div>
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Fecha fin <span style="color:red">*</span>: </label>
                <input class="form-control" type="date" @bind-value="@PeriodoSiltra.FECHAFIN" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Días <span style="color:red">*</span>: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.DIAS" />
            </div>

            <div class="col-md-2">
                <label for="txtsexo" class="fw-bold  widthLabel li-height50">Cuenta cotización <span style="color:red">*</span>: </label>
                <InputSelect @bind-Value="PeriodoSiltra.IDCUENTACOTIZACIONPATRONAL" class="form-select">
                    <option value="">Seleccionar</option>
                    @if (lCuentaCoti != null)
                    {
                        @foreach (var enumera in lCuentaCoti)
                        {
                            <option value="@enumera.IDCUENTACOTIZACIONPATRONAL">@enumera.DESCRIPCION</option>
                        }
                    }
                </InputSelect>
            </div>

            <div class="col-md-2">
                <label for="txtsexo" class="fw-bold  widthLabel li-height50">Tipo liquidación <span style="color:red">*</span>: </label>
                <InputSelect @bind-Value="PeriodoSiltra.IDTIPOLIQUIDACION" class="form-select">
                    <option value="">Seleccionar</option>
                    @if (lTipLiq != null)
                    {
                        @foreach (var enumera in lTipLiq)
                        {
                            <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                        }
                    }
                </InputSelect>
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Ocupación <span style="color:red">*</span>: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.OCUPACION" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">CNAE <span style="color:red">*</span>: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.CNAE" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Grupo Tarifa <span style="color:red">*</span>: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.GRUPOTARIFA" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Estado: </label>
                <InputSelect @bind-Value="PeriodoSiltra.IDESTADO" class="form-select">
                    <option value="">Seleccionar</option>
                    @*    @if (lSexo != null)
                    {
                        @foreach (var enumera in lSexo)
                        {
                            <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                        }
                    } *@
                </InputSelect>
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Tipo periodo tramo <span style="color:red">*</span>: </label>
                <InputSelect @bind-Value="PeriodoSiltra.IDTIPOPERIODOTRAMO" class="form-select">
                    <option value="">Seleccionar</option>
                    @if (lTipPeriodo != null)
                    {
                        @foreach (var enumera in lTipPeriodo)
                        {
                            <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                        }
                    }
                </InputSelect>
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Reducción jornada <span style="color:red">*</span>: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.REDUCCIONJORNADA" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Número días IRPF: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.NUMERODIASIRPF" />
            </div>
            <div class="col-md-2">
                <label for="txtNIF" class="fw-bold widthLabel li-height50">Importe IRPF: </label>
                <input class="form-control" @bind-value="@PeriodoSiltra.IMPORTEIRPF" />
            </div>
        </div>
        @if (idDesencriptado != "0")
        {
            <div class="mt-2">
                <input type="button" value="nuevo tramo" class="btnOAAFAzul mb-2 mt-2" />
                <div style="overflow-x:auto;" class="tablaDesk">
                    <Grid TItem="TRAMOSSILTRA"
                          Class="table tablaRegPers"
                          Data="@lTraSil"
                          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="TRAMOSSILTRA" HeaderText="Tipo tramo" PropertyName="IDTIPOTRAMONavigation?.DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDTIPOTRAMONavigation.DESCRIPCION">

                                @if (context.IDTIPOTRAMONavigation.MODIFICABLE == false && context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == false)
                                {
                                    <p style="color:red; font-weight:bold"> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
                                }
                                @if (context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == true && context.IDTIPOTRAMONavigation.MODIFICABLE == true)
                                {
                                    <p style="color:blue; font-weight:bold"> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
                                }
                                @if (context.IDTIPOTRAMONavigation.SOLICITADOALUSUARIO == false && context.IDTIPOTRAMONavigation.MODIFICABLE == true)
                                {
                                    <p> @context.IDTIPOTRAMONavigation?.CODIGO - @context.IDTIPOTRAMONavigation?.DESCRIPCION </p>
                                }
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe" PropertyName="IMPORTE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IMPORTE">
                                @context.IMPORTE
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="% Empresa" PropertyName="PORCENTAJEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.PORCENTAJEEMPRESA">
                                @context.PORCENTAJEEMPRESA
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe empresa" PropertyName="IMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IMPORTEEMPRESA">
                                @context.IMPORTEEMPRESA
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe empresa" PropertyName="PORCENTAJETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.PORCENTAJETRABAJADOR">
                                @context.PORCENTAJETRABAJADOR
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe empresa" PropertyName="IMPORTETRABAJADOR" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IMPORTETRABAJADOR">
                                @context.IMPORTETRABAJADOR
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe empresa" PropertyName="IMPORTEGLOBAL" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IMPORTEGLOBAL">
                                @context.IMPORTEGLOBAL
                            </GridColumn>
                            <GridColumn TItem="TRAMOSSILTRA" HeaderText="Importe empresa" PropertyName="DESCRIPCIONTRAMOXML" FilterButtonCSSClass="hidden" SortKeySelector="item => item.IDTIPOTRAMONavigation.IDTIPOTRAMOFICHEROXMLNavigation.DESCRIPCION">
                                @context.IDTIPOTRAMONavigation.IDTIPOTRAMOFICHEROXMLNavigation.DESCRIPCION
                            </GridColumn>
                        </GridColumns>
                    </Grid>
                </div>

            </div>
        }
    }
</div>

@code {
    private PERIODOSSILTRA PeriodoSiltra = new PERIODOSSILTRA();
    public EventCallback<string> OnValidationStateChanged { get; set; }
    private List<int> annos = new List<int>();
    private string cl { get; set; }
    private string idn { get; set; }
    private string idDesencriptado { get; set; }
    private List<CUENTASCOTIZACIONPATRONAL> lCuentaCoti = new List<CUENTASCOTIZACIONPATRONAL>();
    private List<ENUMERACIONES> lTipLiq = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> lEstados = new List<ENUMERACIONES>();
    // private List<TIPOSTRAMOS> lTipPeriodo = new List<TIPOSTRAMOS>();
    private List<ENUMERACIONES> lTipPeriodo = new List<ENUMERACIONES>();
    private List<TRAMOSSILTRA> lTraSil = new List<TRAMOSSILTRA>();
    private EditContext editContext = default!;
    private HttpClient cliente = new HttpClient();
    private ValidationMessageStore? messageStore;
    private string errorMessage = "";
    private Modal popupConfirmacion = default!;
    List<ToastMessage> mensajes = new List<ToastMessage>();


    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 url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
        if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
        {
            cl = clValue;
        }       
        idDesencriptado = tsUtilidades.crypt.FEncS(cl,
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
            -875421649);
        if (idDesencriptado != "0")
        {
            var response = await client.GetAsync($"/api/PERIODOSSILTRA/{idDesencriptado}");
            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Error al obtener los datos de la persona. Código: {response.StatusCode}");
            }
            var resultContent = await response.Content.ReadAsStringAsync();
            PeriodoSiltra = JsonConvert.DeserializeObject<PERIODOSSILTRA>(resultContent) ?? throw new Exception("Error al deserializar los datos del Periodo Siltra.");
            foreach (var i in PeriodoSiltra.TRAMOSSILTRA)
            {
                lTraSil.Add(i);
            }
        }
        else
        {
            string idnSt = "";
            if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idn", out var idnValue))
            {
                idn = idnValue;
                idnSt = (tsUtilidades.crypt.FEncS(idn,
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                -875421649));
            }

            PeriodoSiltra = new PERIODOSSILTRA();
            PeriodoSiltra.IDNOMINATRABAJADORCABECERA = Int32.Parse(idnSt);
        }
        lTipLiq = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(client, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPLIQ");
        var rlCuentaCoti = await client.GetAsync("/api/CUENTASCOTIZACIONPATRONAL");
        var rcCuentaCoti = await rlCuentaCoti.Content.ReadAsStringAsync();
        lCuentaCoti = JsonConvert.DeserializeObject<List<CUENTASCOTIZACIONPATRONAL>>(rcCuentaCoti) ?? throw new Exception("Error al deserializar los datos.");
        lEstados = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(client, "/api/ENUMERACIONES/EnumeracionesGrupo/MUT");
        lTipPeriodo = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(client, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPPERTRAM");
    }
    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                //AplicarFiltros();
            }
        }
    }
    private async Task GuardarPeriodoSILTRA()
    {
        // CerrarConfirmacion();
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        // ValidarTodos();
        if (!editContext.GetValidationMessages().Any())

        {
            if (PeriodoSiltra.IDPERIODOSILTRA == 0)//Nuevo
            {

                var response = await Utilidades.NuevoObjeto(cliente, "/api/PERIODOSSILTRA", PeriodoSiltra);
                string link = "/PeriodoSiltra?cl=" + tsUtilidades.crypt.FEncS(response.IDPERIODOSILTRA.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
                NavigationManager.NavigateTo(link, forceLoad: true);

            }
            else//Actualizar
            {
                var PeSilGuardar = PeriodoSiltra;
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/PERIODOSSILTRA/" + PeSilGuardar.IDPERIODOSILTRA, PeSilGuardar);
                var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
                mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Primary,
                    Message = $"Guardado correctamente.",
                });
            }
        }
        else
        {
            var html = "";
            html += "Revise los errores antes de guardar:";
            foreach (string m in editContext.GetValidationMessages())
            {
                html += "\n" + m + ". ";
            }

            mensajes.Add(new ToastMessage
            {
                Type = ToastType.Danger,

                Message = html,

            });

        }
    }
    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);
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(PeriodoSiltra, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private void ValidarYActualizar(string fieldName)
    {
        OnValidationStateChanged.InvokeAsync(fieldName);
    }
    private void ValidarSelect(ChangeEventArgs e, string fieldName)
    {
        if (e?.Value?.ToString() != "")
        {
            int value = int.Parse(e?.Value?.ToString()!);
            PeriodoSiltra?.GetType()?.GetProperty(fieldName)?.SetValue(PeriodoSiltra, value);
        }
        else
        {
            PeriodoSiltra?.GetType()?.GetProperty(fieldName)?.SetValue(PeriodoSiltra, null);
        }
        OnValidationStateChanged.InvokeAsync(fieldName);
    }

}