@page "/InfoPuestosDeTrabajo"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Layout
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using System.Text
@using RegistroPersonalAN.Components.ViewsModels
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using System.Globalization
@using Microsoft.JSInterop
@inject IJSRuntime JSRuntime
@rendermode InteractiveServer
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject NavigationManager Navigation


<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="messages" Placement="ToastsPlacement.BottomCenter" />

<Modal @ref="popupNewPuesto" Class="modal-lg" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="true">
    <BodyTemplate>

        <div class="popupRPCard row">
            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Código:</p>
                <InputText @bind-Value="puestoSelect.CODIGO" class="inputRP"></InputText>
            </div>

            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Estado:</p>
                <InputText required @bind-Value="puestoSelect.ESTADO" class="inputRP"></InputText>
            </div>
            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Dotación:</p>
                <InputSelect style="width:100%" @bind-Value="puestoSelect.IDDOTACION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(puestoSelect.IDDOTACION))">
                    <option value="">-- Seleccione una dotación -- </option>
                    @foreach (var dotacion in listadoDotacion)
                    {
                        <option value="@dotacion.IDDOTACION">@dotacion.DESCRIPCION</option>
                    }
                </InputSelect>
                <div class="validation-message">@GetExternalValidationMessage(nameof(puestoSelect.IDDOTACION))</div>
            </div>
            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Ocupación:</p>
                <InputSelect style="width:100%" @bind-Value="puestoSelect.IDOCUPACION" class="inputForm">
                    <option value=""> </option>

                    @foreach (var ocupa in listadoOcupacion)
                    {
                        <option value="@ocupa.IDOCUPACION">@ocupa.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>
            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Persona:</p>
                @*  <InputSelect style="width:100%" @bind-Value="puestoSelect.IDPERSONAL" class="inputForm">
                <option value=""> </option> *@
                <div class="row col-12">
                <div class="col-11">
                    <input @bind="filterText" @bind:event="oninput" @onfocus="() =>ShowDropdown(0)" @onblur="() =>HideDropdownAfterDelay(1)"
                           placeholder="Seleccione una persona" class="inputForm col-12" style="height:41px;" />

                    @if (showDropdown)
                    {
                        <div class="dropdown-list" style="z-index: 10; border: solid; max-height: 400px; display: block; background: white; position: absolute; width: auto; overflow-x: hidden; margin-top:10px;">
                            @foreach (PERSONAS per in FiltrarPersonas(listadoPersonas, filterText))
                            {
                                <div class="dropdown-item" style="cursor:default" @onclick="() => SelectPersona(per)">
                                    @per.APELLIDOS , @per.NOMBRE
                                </div>
                            }
                        </div>
                    }
                </div>
                <div class="col-1 p-0"><Button Class="btnOAAFAzul" @onclick="vaciarPersona">X</Button></div>
                </div>
            </div>

            <div class="col-md-6" style="flex-direction:column">
                <p class="lblinputRP">Titular:</p>
                <div class="row col-12">
                    <div class="col-11">
                    <input @bind="filterTextTit" @bind:event="oninput" @onfocus="() =>ShowDropdown(1)" @onblur="() =>HideDropdownAfterDelay(1)"
                           placeholder="Seleccione un titular" class="inputForm col-12" style="height:41px;" />

                    @if (showDropdowntit)
                    {
                        <div class="dropdown-list" style="z-index: 10; border: solid; max-height: 400px; display: block; background: white; position: absolute; width: auto; overflow-x: hidden; margin-top:10px;">
                            @foreach (PERSONAS per in FiltrarTitular(listadoPersonas, filterTextTit))
                            {
                                <div class="dropdown-item" style="cursor:default" @onclick="() => SelectTitular(per)">
                                    @per.APELLIDOS , @per.NOMBRE
                                </div>
                            }
                        </div>
                    }
                </div>
                <div class="col-1 p-0"><Button Class="btnOAAFAzul" @onclick="vaciarTitular">X</Button></div>
                </div>

            </div>



            @*   <div class="col-md-6" style="flex-direction:column">
            <p class="lblinputRP">Adscripción:</p>
            <InputSelect style="width:100%" @bind-Value="puestoSelect.IDSERVICIOADSCRITO" class="inputForm">
            <option value=""> </option>

            @foreach (var servicio in listadoServicios)
            {
            <option value="@servicio.IDSERVICIO">@servicio.DESCRIPCION</option>
            }
            </InputSelect>
            </div> *@
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupPuesto">Cerrar</Button>
        @if (puestoSelect.IDPUESTO != 0)
        {
            <Button @onclick="@(() => manejarPuestos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => manejarPuestos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<Modal @ref="popupConfirmacion" title="" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">
            ¿Estás seguro que desea eliminarlo?
        </div>

    </BodyTemplate>
    <FooterTemplate>
        <Button Class="btnOAAFBlack" @onclick="cerrarPopupConfirmacion">Cerrar</Button>

        @if (borrarPuesto)
        {
            <Button @onclick="@(() => manejarPuestos("delete"))" Color="ButtonColor.Danger">Eliminar</Button>
        }
        else
        {
            <Button @onclick="@(() => borrarRPTDes())" Color="ButtonColor.Danger">Eliminar</Button>
        }
    </FooterTemplate>
</Modal>


@if (cl != null && idRPT == "")
{
    <p>Cargando datos...</p>
}
else
{
    <div class="pagina">
        <div class="Cabecera">
            <h6><small><i class="fas fa-briefcase"></i><b>Puestos de Trabajo (<a href="@HashRed()" id="lblNombre"> @lblNombre</a> )</b></small></h6>
        </div>

        <EditForm FormName="FormDesgloseRPT" EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" class="formDtosAdmin">
            <DataAnnotationsValidator />

            <div class="botonera col-12" style="display:flex; gap:5px">
                <Button Class="btnOAAFAzul" @onclick="volver"><Icon CustomIconName="fas fa-long-arrow-alt-left"></Icon> </Button>
                <Button Class="btnOAAFAzul" Type="ButtonType.Submit"> <Icon CustomIconName="fas fa-save"></Icon> </Button>
                <Button Class="btnOAAFAzul" hidden=@ocultarBtnBrr @onclick="abrirPopupConfirmacionRPTDesc"> <Icon CustomIconName="fas fa-trash"></Icon> </Button>

            </div>
            <Tabs Style="padding-top:50px; width:100%;" EnableFadeEffect="true">
                <Tab Title="DATOS RPT" Active="true">
                    <Content>


                        <div class="camposficha row">
                            <div class="col-1 formatoCampos">
                                <label class="tituloLbl">Código:</label>
                                <InputText disabled contenteditable="false" @bind-Value="Model!.CODIGO" class="inputForm"></InputText>
                            </div>


                            <div class="col-1 formatoCampos">
                                <label class="tituloLbl">Plazas: *</label>
                                <input class="form-control @GetCssClass(nameof(Model.PLAZAS))"
                                       type="number"
                                       disabled="@desactivarPlaza"
                                       value="@Model.PLAZAS"
                                       placeholder="@GetPlaceholder(nameof(Model.PLAZAS))"
                                       @oninput="e => ValidarYActualizar(e, nameof(Model.PLAZAS))" />
                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.PLAZAS))</div>
                            </div>

                            <div class="col-4 formatoCampos">
                                <label class="tituloLbl">Denominación: *</label>
                                <input class="form-control @GetCssClass(nameof(Model.DENOMINACION))"
                                       value="@Model!.DENOMINACION"
                                       placeholder="@GetPlaceholder(nameof(Model.DENOMINACION))"
                                       @oninput="e => ValidarYActualizar(e, nameof(Model.DENOMINACION))" />
                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.DENOMINACION))</div>
                            </div>

                            <div class="col-3 formatoCampos">
                                <label class="tituloLbl">Características Esenciales: </label>
                                <InputText @bind-Value="Model!.CARACTERISTICAS" class="inputForm"></InputText>
                            </div>

                            <div class="col-3 formatoCampos">
                                <label class="tituloLbl">Requisitos para el desempeño:</label>
                                <InputText @bind-Value="Model!.REQUISITOS" class="inputForm"></InputText>
                            </div>
                        </div>

                        <div class="camposficha row">

                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Departamentos: *</label>

                                <InputSelect @bind-Value="Model!.IDDEPARTAMENTO" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.IDDEPARTAMENTO))">
                                    <option value="0">-- Seleccione un departamento -- </option>

                                    @foreach (var depart in listadoDepartamento)
                                    {
                                        <option value="@depart.IDENUMERACION">@depart.VALORALFABETICOLARGO</option>
                                    }
                                </InputSelect>

                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.IDDEPARTAMENTO))</div>
                            </div>


                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Adscripción: *</label>

                                <InputSelect @bind-Value="Model!.ADSCRIPCION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.ADSCRIPCION))">
                                    <option value="0">-- Seleccione una adscripción -- </option>

                                    @foreach (var adscrip in listadoAdscri)
                                    {
                                        <option value="@adscrip.IDADSCRIPCION">@adscrip.DESCRIPCION</option>
                                    }
                                </InputSelect>

                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.ADSCRIPCION))</div>
                            </div>


                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Grupo 1: *</label>

                                @if (np == null)
                                {
                                    if (Model!.GRUPO1Navigation != null)
                                    {
                                        <InputText disabled @bind-Value="Model!.GRUPO1Navigation!.GRUPO1" class="inputForm"></InputText>
                                    }
                                }
                                else
                                {
                                    <InputSelect @bind-Value="Model!.GRUPO1" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.GRUPO1))">
                                        <option value="0">-- Seleccione un grupo -- </option>


                                        @foreach (var grupo in listadoGrupo)
                                        {
                                            <option value="@grupo.IDGRUPO">@grupo.GRUPO1</option>
                                        }
                                    </InputSelect>

                                    <div class="validation-message">@GetExternalValidationMessage(nameof(Model.GRUPO1))</div>

                                }


                            </div>

                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Grupo 2: </label>
                                <InputSelect @bind-Value="Model!.GRUPO2" class="inputForm">
                                    <option value=""></option>

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


                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Específico: *</label>
                                <CurrencyInput TValue="decimal?" Locale="es-ES" @bind-Value="Model!.ESPECIFICO" Style="text-align:right;" class="inputForm"></CurrencyInput>
                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.ESPECIFICO))</div>
                            </div>

                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Nivel: *</label>
                                <InputSelect @bind-Value="Model!.IDNIVEL_RPT" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.IDNIVEL_RPT))">
                                    <option value="0">-- Seleccione un nivel -- </option>

                                    @foreach (var nivel in listadoNvl)
                                    {
                                        <option value="@nivel.IDNIVEL">@nivel.DESCRIPCION</option>
                                    }
                                </InputSelect>

                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.IDNIVEL_RPT))</div>
                            </div>


                        </div>

                        <div class="camposficha row">



                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Provisión: *</label>
                                <InputSelect @bind-Value="Model!.PROVISION" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.PROVISION))">
                                    <option value="0">-- Seleccione una provisión -- </option>
                                    @foreach (var provisi in listadoProvisi)
                                    {
                                        <option value="@provisi.IDPROVISION">@provisi.DESCRIPCION</option>
                                    }
                                </InputSelect>

                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.PROVISION))</div>
                            </div>

                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Cuerpo 1: *</label>
                                <InputSelect @bind-Value="Model!.CUERPO1" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(Model.CUERPO1))">
                                    <option value="0">-- Seleccione un cuerpo -- </option>

                                    @foreach (var cuerpo in listadoCuerpo)
                                    {
                                        <option value="@cuerpo.IDCUERPO">@cuerpo.DESCRIPCION</option>
                                    }
                                </InputSelect>

                                <div class="validation-message">@GetExternalValidationMessage(nameof(Model.CUERPO1))</div>
                            </div>

                            <div class="col-2 formatoCampos">
                                <label class="tituloLbl">Cuerpo 2:</label>
                                <InputSelect @bind-Value="Model!.CUERPO2" class="inputForm">
                                    <option value=""></option>
                                    @foreach (var cuerpo in listadoCuerpo)
                                    {
                                        <option value="@cuerpo.IDCUERPO">@cuerpo.DESCRIPCION</option>
                                    }
                                </InputSelect>
                            </div>

                            <div class="col-auto formatoCampos">
                                <label class="tituloLbl">Art.66.2 DTO 2/2002</label>
                                <InputCheckbox @bind-Value="Model!.VIRTUAL" class="inputRP"></InputCheckbox>
                            </div>

                            <div class="col-auto formatoCampos">
                                <label class="tituloLbl">Art. 7.1.A RD.365/1995</label>
                                <InputCheckbox @bind-Value="Model.VIRTUALAC" class="inputForm"></InputCheckbox>
                            </div>

                            <div class="col-auto formatoCampos">
                                <label class="tituloLbl">Art. 7.1.b)RD 365/1995</label>
                                <InputCheckbox @bind-Value="Model!.VIRTUALAC2" class="inputForm"></InputCheckbox>
                            </div>
                        </div>

                    </Content>
                </Tab>
            </Tabs>

        </EditForm>

        @if (!string.IsNullOrEmpty(idRPTDes))
        {
            <Tabs Style="padding-top:50px; width:100%;" EnableFadeEffect="true">
                <Tab Title="Descripción RPT" Active="true">
                    <Content>
                        <div style="display:block;gap:10px; margin-bottom:20px;" class="mt-4">
                            <Button class="btnOAAFAzul" @onclick="@(() => abrirPopupPuestos(new PUESTOS()))">  Nuevo puesto  </Button>
                            <Grid TItem="bdAntifraude.db.PUESTOS"
                                  Class="table tablaRegPers"
                                  Data="listadoPuestos"
                                  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="bdAntifraude.db.PUESTOS" HeaderText="Código" Class="col-1" PropertyName="CODIGO" SortKeySelector="item => item.CODIGO">
                                        @context.CODIGO
                                    </GridColumn>
                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Estado" Class="col-1" PropertyName="ESTADO" SortKeySelector="item => item.ESTADO">
                                        @context.ESTADO
                                    </GridColumn>
                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Dotación" PropertyName="IDDOTACIONNavigation">
                                        @context.IDDOTACIONNavigation?.DESCRIPCION
                                    </GridColumn>

                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Persona" PropertyName="IDPERSONALNavigation">
                                        @context.IDPERSONALNavigation?.NOMBRE @context.IDPERSONALNavigation?.APELLIDOS
                                    </GridColumn>

                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Ocupación" PropertyName="IDOCUPACIONNavigation">
                                        @context.IDOCUPACIONNavigation?.DESCRIPCION
                                    </GridColumn>

                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Titular" PropertyName="TITULARNavigation">
                                        @context.TITULARNavigation?.NOMBRE @context.TITULARNavigation?.APELLIDOS
                                    </GridColumn>

                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" HeaderText="Adscripción al servicio" PropertyName="IDRPTNavigation?.IDSITUACIONNavigation">
                                        @context.IDSERVICIOADSCRITONavigation?.DESCRIPCION
                                    </GridColumn>


                                    <GridColumn TItem="bdAntifraude.db.PUESTOS" Class="col-1" HeaderText="">
                                        <span @onclick="@(() => abrirPopupPuestos(@context))" style="cursor: pointer;">
                                            <Icon CustomIconName="fas fa-edit"></Icon>
                                        </span>
                                        <span @onclick="@(() => abrirPopupConfirmacion(@context))" style="cursor: pointer;">
                                            <Icon CustomIconName="fas fa-trash"></Icon>
                                        </span>
                                    </GridColumn>

                                </GridColumns>
                            </Grid>

                        </div>

                    </Content>
                </Tab>
            </Tabs>
        }

    </div>

}



@code {
    /// ATRIBUTOS

    [Parameter]
    public string? cl { get; set; } = "";
    [Parameter]
    public string? np { get; set; } = "";
    public bool ocultarBtnBrr { get; set; }
    private bool desactivarPlaza { get; set; }
    public string idRPTDes { get; set; } = "";
    public string idRPT { get; set; } = "";
    List<ToastMessage> messages = new List<ToastMessage>();
    [SupplyParameterFromForm]
    private RPT_DESCRIP Model { get; set; } = new RPT_DESCRIP();
    private PUESTOS puestoSelect = new PUESTOS();
    private PUESTOS puestoOriginal = new PUESTOS();
    private string tituloPopup = "";
    private Modal popupNewPuesto = default!;
    private Modal popupConfirmacion = default!;
    private string lblNombre = "";
    public bool borrarPuesto { get; set; }

    // LISTADOS PARA COMBOBOX
    private List<ENUMERACIONES> listadoDepartamento = new List<ENUMERACIONES>();
    private List<ADSCRIPCION> listadoAdscri = new List<ADSCRIPCION>();
    private List<GRUPO> listadoGrupo = new List<GRUPO>();
    private List<NIVEL> listadoNvl = new List<NIVEL>();
    private List<PROVISION> listadoProvisi = new List<PROVISION>();
    private List<CUERPO> listadoCuerpo = new List<CUERPO>();
    private List<OCUPACION> listadoOcupacion = new List<OCUPACION>();
    private List<SERVICIOS> listadoServicios = new List<SERVICIOS>();
    private List<DOTACION> listadoDotacion = new List<DOTACION>();
    private List<PERSONAS> listadoPersonas = new List<PERSONAS>();
    private List<string> listadoGruposRPT = new List<string>();
    private bool showDropdown { get; set; }
    private bool showDropdowntit { get; set; }
    private string filterText { get; set; } = "";
    private string filterTextTit { get; set; } = "";
    private string linkVolver { get; set; } = "";

    //LIST GRID PUESTOS
    private List<PUESTOS> listadoPuestos = new List<PUESTOS>();
    private HttpClient cliente = new HttpClient();
    private EditContext? editContext;
    private ValidationMessageStore? messageStore;
    private void ShowDropdown(int dropdown)
    {
        if (dropdown == 0)
        {
            showDropdown = true;
        }
        if (dropdown == 1)
        {
            showDropdowntit = true;
        }
    }
    private async void HideDropdownAfterDelay(int dropdown)
    {
        // Pequeño delay para no cerrar el dropdown antes de poder hacer clic
        // (opcional, puedes eliminarlo si no es necesario)
        if (dropdown == 0)
        {
            await Task.Delay(200);
            showDropdown = false;
            StateHasChanged();
        }
        if (dropdown == 1)
        {
            await Task.Delay(200);
            showDropdowntit = false;
            StateHasChanged();
        }
    }
    private IEnumerable<PERSONAS> FiltrarPersonas(IEnumerable<PERSONAS> pers, string text)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            // Sin texto: muestra todos
            return pers.OrderBy(p => p.APELLIDOS);
        }
        else
        {
            // Con texto: filtramos
            return pers
            .Where(p => p.NOMBRE.Contains(text, StringComparison.OrdinalIgnoreCase) || p.APELLIDOS.Contains(text, StringComparison.OrdinalIgnoreCase))
            .OrderBy(p => p.APELLIDOS);
        }
    }
    private void SelectPersona(PERSONAS pers)
    {
        filterText = pers.NOMBRE + " " + pers.APELLIDOS;
        puestoSelect.IDPERSONAL = pers.IDPERSONA;
        showDropdown = false;
    }
    private void vaciarPersona()
    {
        filterText = "";
        puestoSelect.IDPERSONAL = null;
        showDropdown = false;
    }
    private IEnumerable<PERSONAS> FiltrarTitular(IEnumerable<PERSONAS> pers, string text)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            // Sin texto: muestra todos
            return pers.OrderBy(p => p.APELLIDOS);
        }
        else
        {
            // Con texto: filtramos
            return pers
            .Where(p => p.NOMBRE.Contains(text, StringComparison.OrdinalIgnoreCase) || p.APELLIDOS.Contains(text, StringComparison.OrdinalIgnoreCase))
            .OrderBy(p => p.APELLIDOS);
        }
    }
    private void SelectTitular(PERSONAS pers)
    {
        filterTextTit = pers.NOMBRE + " " + pers.APELLIDOS;
        puestoSelect.TITULAR = pers.IDPERSONA;
        showDropdowntit = false;
    }
    private void vaciarTitular()
    {
        filterTextTit = "";
        puestoSelect.TITULAR = null;
        showDropdown = false;
    }
    protected void volver() { Navigation.NavigateTo(linkVolver, forceLoad: true); }
    protected override async Task OnInitializedAsync()
    {
        try
        {
            editContext = new EditContext(Model);
            messageStore = new ValidationMessageStore(editContext);

            var uri = Navigation.ToAbsoluteUri(Navigation.Uri);

            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("cl", out var clValue))
            {
                cl = clValue;
            }

            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("np", out var clValueNp))
            {
                np = clValueNp;
                idRPT = tsUtilidades.crypt.FEncS(np, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
            }

            idRPTDes = tsUtilidades.crypt.FEncS(cl, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);

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


            if (string.IsNullOrEmpty(idRPTDes))
            {
                ocultarBtnBrr = true;
                await rellenarListados();
                await rellenarLitadoDepartamentos();
                await rellenarLitadoServicios();
                await rellanarListPersonas();
                desactivarPlaza = false;
            }
            else
            {
                ocultarBtnBrr = false;
                desactivarPlaza = true;

                Model = await Utilidades.ObtenerObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP/" + idRPTDes);
                lblNombre = Model?.IDRPTNavigation?.DESCRIPCION ?? "";
                idRPT = Model?.IDRPT.ToString()!;


                await rellenarListados();
                await rellenarLitadoDepartamentos();
                await rellenarLitadoServicios();
                await rellanarListPersonas();
                await gridPuestos();

                var culture = new CultureInfo("es-ES");
                CultureInfo.DefaultThreadCurrentCulture = culture;
                CultureInfo.DefaultThreadCurrentUICulture = culture;
            }

            linkVolver = "/DesgloseRPT?cl=" + tsUtilidades.crypt.FEncS(idRPT, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        }
        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(Model, fieldName);

        switch (fieldName)
        {
            case nameof(Model.GRUPO1):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.GRUPO1 = int.Parse(value);
                }
                else
                {
                    Model.GRUPO1 = 0;
                }
                break;
            case nameof(Model.PLAZAS):

                if (!string.IsNullOrEmpty(value))
                {

                    Model.PLAZAS = int.Parse(value);
                }
                else
                {
                    Model.PLAZAS = 0;
                }

                break;
            case nameof(Model.DENOMINACION): Model.DENOMINACION = value; break;
            case nameof(Model.IDDEPARTAMENTO):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.IDDEPARTAMENTO = int.Parse(value);
                }
                else
                {
                    Model.IDDEPARTAMENTO = 0;
                }
                break;
            case nameof(Model.ADSCRIPCION):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.ADSCRIPCION = int.Parse(value);
                }
                else
                {
                    Model.ADSCRIPCION = 0;
                }
                break;
            case nameof(Model.IDNIVEL_RPT):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.IDNIVEL_RPT = int.Parse(value);
                }
                else
                {
                    Model.IDNIVEL_RPT = 0;
                }
                break;
            case nameof(Model.PROVISION):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.PROVISION = int.Parse(value);
                }
                else
                {
                    Model.PROVISION = 0;
                }
                break;
            case nameof(Model.ESPECIFICO):

                if (!string.IsNullOrEmpty(value))
                {
                    string valueString = value.Replace("€", "").Replace(" ", "").Replace(".", "");
                    Model.ESPECIFICO = decimal.Parse(valueString);
                }
                else
                {
                    Model.ESPECIFICO = 0;
                }

                break;
            case nameof(Model.CUERPO1):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.CUERPO1 = int.Parse(value);
                }
                else
                {
                    Model.CUERPO1 = 0;
                }
                break;
            case nameof(puestoSelect.IDDOTACION):
                if (!string.IsNullOrEmpty(value))
                {

                    puestoSelect.IDDOTACION = int.Parse(value);
                }
                else
                {
                    puestoSelect.IDDOTACION = 0;
                }
                break;
        }

        messageStore?.Clear(field);
        if (fieldName == nameof(puestoSelect.IDDOTACION) && puestoSelect.IDDOTACION == 0)
        {
            messageStore?.Add(field, "Seleccione una dotación.");
        }

        if (fieldName == nameof(Model.GRUPO1) && Model.GRUPO1 == 0)
        {
            messageStore?.Add(field, "Seleccione un grupo.");
        }

        if (fieldName == nameof(Model.IDDEPARTAMENTO) && Model.IDDEPARTAMENTO == 0)
        {
            messageStore?.Add(field, "Seleccione un departamento.");
        }

        if (fieldName == nameof(Model.ADSCRIPCION) && Model.ADSCRIPCION == 0)
        {
            messageStore?.Add(field, "Seleccione una adscripción.");
        }

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

        if (fieldName == nameof(Model.PROVISION) && Model.PROVISION == 0)
        {
            messageStore?.Add(field, "Seleccione una provisión.");
        }

        if (fieldName == nameof(Model.CUERPO1) && Model.CUERPO1 == 0)
        {
            messageStore?.Add(field, "Seleccione un cuerpo.");
        }

        if (fieldName == nameof(Model.PLAZAS) && Model.PLAZAS <= 0)
        {
            messageStore?.Add(field, "El número de plazas debe ser mayor que 0.");
        }

        if (fieldName == nameof(Model.ESPECIFICO) && Model.ESPECIFICO <= 0)
        {
            messageStore?.Add(field, "El número específico debe ser mayor que 0.");
        }

        if (fieldName == nameof(Model.DENOMINACION) && string.IsNullOrEmpty(Model.DENOMINACION))
        {
            messageStore?.Add(field, "La denominación es obligatoria.");
        }
        else if (fieldName == nameof(Model.DENOMINACION) && Model!.DENOMINACION!.Length > 100)
        {

            messageStore?.Add(field, "La denominación no puede tener más de 100 caracteres.");
        }

        editContext?.NotifyValidationStateChanged();
    }
    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = Model.GRUPO1 }, nameof(Model.GRUPO1));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.PLAZAS }, nameof(Model.PLAZAS));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.DENOMINACION }, nameof(Model.DENOMINACION));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.IDDEPARTAMENTO }, nameof(Model.IDDEPARTAMENTO));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.ADSCRIPCION }, nameof(Model.ADSCRIPCION));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.IDNIVEL_RPT }, nameof(Model.IDNIVEL_RPT));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.PROVISION }, nameof(Model.PROVISION));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.CUERPO1 }, nameof(Model.CUERPO1));
        ValidarYActualizar(new ChangeEventArgs { Value = Model.ESPECIFICO }, nameof(Model.ESPECIFICO));
    }
    private void ValidarPuesto()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = puestoSelect.IDDOTACION }, nameof(puestoSelect.IDDOTACION));
    }
    private string GetPlaceholder(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetCssClass(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore![field].Any() ? "is-invalid" : string.Empty;
    }
    private void MostrarErrores()
    {
        messageStore?.Clear();
        foreach (var field in new[] { nameof(Model.GRUPO1), nameof(Model.PLAZAS) })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(DesgloseRPTVM).GetProperty(field)?.GetValue(Model) }, field);
        }
    }
    private async Task ObtenerDotacionPorId(int idDotacion)
    {

        try
        {

            Expression<Func<DOTACION, bool>> filtro = x => x.IDDOTACION == idDotacion;

            puestoSelect.IDDOTACIONNavigation = await Utilidades.ObtenerObjeto<DOTACION>(cliente, "/api/DOTACION/filtrar-entidad", filtro);

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }

    }

    // RELLENAR GRID PUESTOS
    private async Task gridPuestos()
    {
        try
        {
            Expression<Func<PUESTOS, bool>> filtro = x => x.IDRPTDES == int.Parse(idRPTDes);

            listadoPuestos = await Utilidades.ObtenerObjeto<List<PUESTOS>>(cliente, "/api/PUESTOS/GetWithIncludes/" + idRPTDes);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellanarListPersonas()
    {
        try
        {
            Expression<Func<PERSONAS, bool>> filtro = x => x.FECHABAJA.HasValue == false;

            listadoPersonas = await Utilidades.ObtenerObjeto<List<PERSONAS>>(cliente, "/api/PERSONAS/filtrar", filtro);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }

    // RELLENAR LISTAS
    private async Task rellenarListados()
    {
        try
        {
            List<string> listadosAEncontrar = new List<string>()
            {
                "UNIDADADMINISTRATIVA", "ADSCRIPCION", "GRUPO", "NIVEL", "PROVISION", "CUERPO", "OCUPACION","DOTACION"
            };

            foreach (string listado in listadosAEncontrar)
            {
                var response = await cliente.GetAsync("/api/" + listado + "/");

                if (response.IsSuccessStatusCode)
                {
                    var resultContent = await response.Content.ReadAsStringAsync();

                    switch (listado)
                    {
                        case "ADSCRIPCION":
                            listadoAdscri = JsonConvert.DeserializeObject<List<ADSCRIPCION>>(resultContent) ?? new List<ADSCRIPCION>();
                            break;

                        case "GRUPO":
                            listadoGrupo = JsonConvert.DeserializeObject<List<GRUPO>>(resultContent) ?? new List<GRUPO>();
                            break;

                        case "NIVEL":
                            listadoNvl = JsonConvert.DeserializeObject<List<NIVEL>>(resultContent) ?? new List<NIVEL>();
                            break;
                        case "PROVISION":
                            listadoProvisi = JsonConvert.DeserializeObject<List<PROVISION>>(resultContent) ?? new List<PROVISION>();
                            break;

                        case "CUERPO":
                            listadoCuerpo = JsonConvert.DeserializeObject<List<CUERPO>>(resultContent) ?? new List<CUERPO>();
                            break;
                        case "OCUPACION":
                            listadoOcupacion = JsonConvert.DeserializeObject<List<OCUPACION>>(resultContent) ?? new List<OCUPACION>();
                            break;
                        case "DOTACION":
                            listadoDotacion = JsonConvert.DeserializeObject<List<DOTACION>>(resultContent) ?? new List<DOTACION>();
                            break;

                    }
                }
                else
                {
                    Console.WriteLine($"Error al obtener los datos: {response.StatusCode}");
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellenarLitadoServicios()
    {
        try
        {

            listadoServicios = await Utilidades.ObtenerObjeto<List<SERVICIOS>>(cliente, "/api/SERVICIOS");

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task rellenarLitadoDepartamentos()
    {
        try
        {
            Expression<Func<ENUMERACIONES, bool>> filtro = x => x.IDGRUPOENUMERACIONNavigation!.GRUPO! == "DEP";

            List<ENUMERACIONES> enumsEncontrado = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/filtrar", filtro);

            listadoDepartamento = enumsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }

    // MANEJAR GRIDS
    private async Task manejarPuestos(string accion)
    {
        try
        {

            switch (accion)
            {
                case "update":
                    ValidarPuesto();

                    if (!editContext.GetValidationMessages().Any())
                    {
                        // if (puestoSelect.PERSONAQUEOCUPA == "" || puestoSelect.PERSONAQUEOCUPA == "N/A") { puestoSelect.IDPERSONAL = null; }
                        // if (puestoSelect.PERSONAQUETITULAR== "" || puestoSelect.PERSONAQUETITULAR== "N/A") { puestoSelect.TITULAR= null; } 
                       
                        await Utilidades.ActualizarObjeto<PUESTOS>(cliente, "/api/PUESTOS/" + puestoSelect.IDPUESTO, puestoSelect);
                        await gridPuestos();
                        await cerrarPopupPuesto();
                    }


                    break;

                case "create":

                    ValidarPuesto();

                    if (!editContext.GetValidationMessages().Any())
                    {
                        puestoSelect.IDRPTDES = int.Parse(idRPTDes);
                        puestoSelect.IDRPT = Model!.IDRPT;

                        await Utilidades.NuevoObjeto<PUESTOS>(cliente, "/api/PUESTOS", puestoSelect);
                        await gridPuestos();
                        await cerrarPopupPuesto();
                    }
                    break;

                case "delete":
                    var responsed = await cliente.DeleteAsync("/api/PUESTOS/" + puestoSelect.IDPUESTO);
                    await gridPuestos();
                    await cerrarPopupConfirmacion();
                    break;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }

    //POPUPS
    private async Task abrirPopupPuestos(PUESTOS puesto)
    {
        puestoSelect = puesto;

        if (puesto.IDPUESTO != 0)
        {
            //  puestoOriginal = puesto;
            filterText = puestoSelect.PERSONAQUEOCUPA;
            filterTextTit = puestoSelect.PERSONAQUETITULAR;
            tituloPopup = "Modificar puesto";
        }
        else
        {
            filterText = null;
            filterTextTit = null;
            tituloPopup = "Nuevo puesto";
        }

        await popupNewPuesto.ShowAsync();
    }
    private async Task cerrarPopupPuesto()
    {
        await popupNewPuesto.HideAsync();
    }
    private async Task cerrarPopupConfirmacion()
    {
        await popupConfirmacion.HideAsync();
    }

    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {

            ValidarTodo();
            if (!editContext!.GetValidationMessages().Any())
            {
                await guardarRPTForm();

                messages.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
            }
            else
            {
                messages.Add(new ToastMessage
                    {
                        Type = ToastType.Warning,
                        Message = $"Debe rellenar los campos obligatorios.",
                    });
            }

        }
        catch (Exception)
        {
            messages.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                    Message = $"Error al guardar.",
                });
        }

    }
    private async Task guardarRPTForm()
    {
        try
        {

            if (!string.IsNullOrEmpty(idRPTDes))
            {
                var a = await Utilidades.ActualizarObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP/" + Model!.IDRPTDES, Model);
                Navigation.NavigateTo(Navigation.Uri, true);
            }
            else
            {
                Model!.IDRPT = int.Parse(idRPT);

                await ObtenerCodigo();

                var rptDesAgregado = await Utilidades.NuevoObjeto<bdAntifraude.db.RPT_DESCRIP>(cliente, "/api/RPT_DESCRIP", Model);

                await GenerarPlazas(rptDesAgregado);

                string link = "/InfoPuestosDeTrabajo?cl=" + tsUtilidades.crypt.FEncS(rptDesAgregado.IDRPTDES.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

                Navigation.NavigateTo(link, forceLoad: true);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task ObtenerCodigo()
    {
        GRUPO grupoSeleccionado = await Utilidades.ObtenerObjeto<GRUPO>(cliente, "/api/GRUPO/" + Model!.GRUPO1.ToString());
        listadoGruposRPT = await Utilidades.ObtenerObjeto<List<string>>(cliente, "/api/RPT_DESCRIP/GetAtributo/" + idRPT + "/" + Model!.GRUPO1.ToString());

        int ultimoPues = 0;

        if (listadoGruposRPT.Count() > 0)
        {
            ultimoPues = int.Parse(listadoGruposRPT.Last().Split('.')[1]);
        }

        Model!.CODIGO = grupoSeleccionado?.GRUPO1?.Trim() + "." + (ultimoPues + 1).ToString();

    }
    private async Task GenerarPlazas(RPT_DESCRIP rptDes)
    {
        Expression<Func<DOTACION, bool>> filtro = x => x.DOTACION1 == "ND";

        DOTACION dotaci = await Utilidades.ObtenerObjeto<DOTACION>(cliente, "/api/DOTACION/filtrar-entidad", filtro);

        for (int i = 0; i < rptDes.PLAZAS; i++)
        {

            PUESTOS pues = new PUESTOS();
            pues.CODIGO = rptDes.CODIGO + "." + (i + 1).ToString();
            pues.ESTADO = "L";
            pues.IDDOTACION = dotaci.IDDOTACION;
            pues.ORDEN = i + 1;
            pues.IDRPT = rptDes.IDRPT;
            pues.IDRPTDES = rptDes.IDRPTDES;

            await Utilidades.NuevoObjeto<PUESTOS>(cliente, "/api/PUESTOS", pues);
        }

    }

    // ELIMINAR
    private async Task borrarRPTDes()
    {

        var responsed = await cliente.DeleteAsync("/api/RPT_DESCRIP/" + idRPTDes);

        await cerrarPopupConfirmacion();

        string idRPTEncriptado = tsUtilidades.crypt.FEncS(idRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

        Navigation.NavigateTo("/DesgloseRPT?cl=" + idRPTEncriptado, forceLoad: true);
    }
    private async Task abrirPopupConfirmacion(PUESTOS puestoBorrar)
    {
        borrarPuesto = true;
        puestoSelect = puestoBorrar;

        await popupConfirmacion.ShowAsync();
    }
    private async Task abrirPopupConfirmacionRPTDesc()
    {
        borrarPuesto = false;
        await popupConfirmacion.ShowAsync();
    }
    private string HashRed()
    {
        string link = "/DesgloseRPT?cl=" + tsUtilidades.crypt.FEncS(idRPT.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        return link;
    }
}
