@page "/InfoPers"
@page "/InfoPers/{cl}"
@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 System.Text
@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

@* <EditForm EditContext="@editContext">
    <DataAnnotationsValidator /> *@

<Modal @ref="popupConfirmacion" Title="Confirmar Guardar persona" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <p>Se van a dar de alta o modificar datos de la persona seleccionada ¿desea continuar?</p>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="CerrarConfirmacion">Cancelar</Button>

        <Button @onclick="GuardarPersona" Color="ButtonColor.Primary">Aceptar</Button>

    </FooterTemplate>
</Modal>
<Modal @ref="popupCodigoPostal" Title="Seleccionar localidad" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <p>Varias localidades comparten este mismo código postal, seleccione a la que se refiere</p>
        <InputSelect @bind-Value="@CPSELECT" class="form-select">           
            @if (lposiblesLocal != null)
            {
                @foreach (var enumera in lposiblesLocal)
                {
                    <option value="@enumera.IDCODIGOPOSTAL">@enumera.CODIGOPOSTAL - @enumera.CODIGOMUNICIPIONavigation.NOMBRE</option>
                }
            }
        </InputSelect>
    </BodyTemplate>
    <FooterTemplate>
       <Button @onclick="setCP" Color="ButtonColor.Primary">Aceptar</Button> 

    </FooterTemplate>
</Modal>
<div class="datos-personales-container mt-3">
    <div>
        <div>
            <div><input type="button" class="btnOAAFAzul mb-2" value="Guardar persona" @onclick="GuardarPersona" /></div>
            <div class="row flex-grow-1 mb-4">
                <!-- Imagen -->
                <div class="col-xl-2 flex-column">
                    <div class="bin-img-emp-place-holder bin-img-text-panel position-relative imgInfoPersona  d-flex justify-content-center">
                        @if (!string.IsNullOrEmpty(FotoBase64))
                        {
                            <img src="data:image/jpeg;base64,@FotoBase64" alt="Foto de la persona" style="width:auto; height: 100%; overflow:hidden; object-fit: cover;" />
                        }
                        else
                        {
                            <div class="bin-img-tbl d-flex justify-content-center align-items-center h-100">
                                <div>No hay imagen</div>
                            </div>
                        }
                        <!-- Input "oculto" que ocupa el espacio del contenedor -->
                        <InputFile OnChange="@(args => ProcesarImagen(args))" accept="image/*" style="opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: pointer;" />
                    </div>
                </div>
                <div class="col-md-10">
                    <Tabs @ref=tabsDtsPer style="margin-top:25px; font-size:12px; gap:0;" OnShown="@(args => OnTabShownAsync(args))">                       
                        <Tab Title="Datos Identificativos" Name="tabDatosIdentificativos" Active="true">
                            <Content>
                                <div class="row mb-3 mt-4">
                                    <!-- Otros campos del formulario -->
                                    <div class="col-md-4">
                                        <label for="txtdni" class="fw-bold">D.N.I.<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtdni" @bind-value="@persona.NIF" @onblur="e => ValidarYActualizar(nameof(persona.NIF))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.NIF))</div>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtsexo" class="fw-bold">Sexo<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDSEXO))"
                                                id="sexo"
                                                value="@persona.IDSEXO"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDSEXO))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in ListaSexos)
                                            {
                                                <option value="@gru.IDENUMERACION">@gru.DESCRIPCION</option>
                                            }
                                        </select>

                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtTipPer" class="fw-bold">Tipo Personal<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDTIPO))"
                                                id="sexo"
                                                value="@persona.IDTIPO"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDTIPO))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lTiposPers)
                                            {
                                                <option value="@gru.IDENUMERACION">@gru.DESCRIPCION</option>
                                            }
                                        </select>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtFeNac" class="fw-bold">Fecha Nacimiento<span style="color:red">*</span> : </label>
                                        <input type="date" class="form-control" id="txtFeNac" @bind-value="@persona.FECHANACIMIENTO" @onblur="e => ValidarYActualizar(nameof(persona.FECHANACIMIENTO))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.FECHANACIMIENTO))</div>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtLuNac" class="fw-bold">Lugar Nacimiento: </label>
                                        <input class="form-control" id="txtLuNac" @bind-value="@persona.LUGARNACIMIENTO" />
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtCodigoAnt" class="fw-bold">Código Antiguo: </label>
                                        <input class="form-control" id="txtCodigoAnt" @bind-value="@persona.CODIGOANTIGUODIPUTADO" />
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtApellidos" class="fw-bold">Apellidos<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtApellidos" @bind-value="@persona.APELLIDOS" @onblur="e => ValidarYActualizar(nameof(persona.APELLIDOS))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.APELLIDOS))</div>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtNombre" class="fw-bold">Nombre<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtNombre" @bind-value="@persona.NOMBRE" @onblur="e => ValidarYActualizar(nameof(persona.NOMBRE))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.NOMBRE))</div>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtNivel" class="fw-bold">Nivel<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtNivel" @bind-value="@persona.NIVEL" @onblur="e => ValidarYActualizar(nameof(persona.NIVEL))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.NIVEL))</div>
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtTiCont" class="fw-bold">Tipo Contrato<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDCONTRATO))"
                                                id="sexo"
                                                value="@persona.IDCONTRATO"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDCONTRATO))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lTipoContra)
                                            {
                                                <option value="@gru.IDCONTRATO">@gru.CODIGO - @gru.DESCRIPCION</option>
                                            }
                                        </select>                                        
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtGrupo" class="fw-bold">Grupo<span style="color:red">*</span> : </label>

                                        <select class="form-select @GetCssClass(nameof(persona.IDGRUPOFUNCIONARIO))"
                                                id="sexo"
                                                value="@persona.IDGRUPOFUNCIONARIO"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDGRUPOFUNCIONARIO))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lGrupo)
                                            {
                                                <option value="@gru.IDENUMERACION">@gru.DESCRIPCION</option>
                                            }
                                        </select>                                                                  
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtCuentaCotizacion" class="fw-bold">Cuenta Cotización<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDCUENTACOTIZACIONPATRONAL))"
                                                id="sexo"
                                                value="@persona.IDCUENTACOTIZACIONPATRONAL"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDCUENTACOTIZACIONPATRONAL))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lCuentaCoti)
                                            {
                                                <option value="@gru.IDCUENTACOTIZACIONPATRONAL">@gru.CODIGO - @gru.DESCRIPCION </option>
                                            }
                                        </select>                                    
                                    </div>
                                    <!---->
                                    <div class="col-md-4">
                                        <label for="txtDepartamento" class="fw-bold">Departamento<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDDEPARTAMENTO))"
                                                id="sexo"
                                                value="@persona.IDDEPARTAMENTO"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDDEPARTAMENTO))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lCuentaCoti)
                                            {
                                                <option value="@gru.IDCUENTACOTIZACIONPATRONAL">@gru.CODIGO - @gru.DESCRIPCION </option>
                                            }
                                        </select>
                                       
                                    </div>
                                    <div class="col-md-4">
                                        <label for="txtDepartamento" class="fw-bold">Ocupación<span style="color:red">*</span> : </label>
                                        <select class="form-select @GetCssClass(nameof(persona.IDOCUPACION))"
                                                id="sexo"
                                                value="@persona.IDOCUPACION"
                                                @onchange="e => ValidarSelect(e, nameof(persona.IDOCUPACION))">
                                            <option value="">Seleccionar</option>
                                            @foreach (var gru in lOcupacion)
                                            {
                                                <option value="@gru.IDENUMERACION">@gru.DESCRIPCION </option>
                                            }
                                            </select>                                       
                                    </div>

                                </div>
                            </Content>
                        </Tab>
                        <Tab Title="Datos de Contacto" Name="tabDatosContacto" >
                            <Content>
                                <div class="row mb-3 mt-4">                                   
                                    <div class="col-md-6">
                                        <label for="txtDireccion" class="fw-bold">Dirección<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.DOMICILIO" @onblur="e => ValidarYActualizar(nameof(persona.DOMICILIO))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.DOMICILIO))</div>
                                    </div>                                   
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Código postal<span style="color:red">*</span> : </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.CODIGOPOSTAL" @onfocusout="@(() => SeleccionarCP(persona.CODIGOPOSTAL, "contacto"))" @onblur="e => ValidarYActualizar(nameof(persona.CODIGOPOSTAL))" />
                                        <div class="validation-message">@GetExternalValidationMessage(nameof(persona.CODIGOPOSTAL))</div>
                                   </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Población: </label>
                                        <input class="form-control" id="txtDireccion" readonly="readonly" value="@nomMuni" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Provincia: </label>
                                        <input class="form-control" id="txtDireccion" readonly="readonly" value="@nomProv" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Telefono 1: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.TELEFONO1" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Telefono 2: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.TELEFONO2" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Email: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.CORREOELECTRONICO" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Puestro Trabajo en Tarjeta: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.PUESTOTRABAJOENTARJETA" />
                                    </div>
                                </div>
                            </Content>
                        </Tab>
                        <Tab Title="Domicilio Notificaciones" Name="tabDomicilioNotificaciones">
                            <Content>
                                <div class="row mb-3 mt-4">
                                    <div class="col-md-6">
                                        <label for="txtDireccion" class="fw-bold">Dirección: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.DOMICILIONOTIFICACIONES" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Código postal: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.CODIGOPOSTALNOTIFICACIONES" @onfocusout="@(() => SeleccionarCP(persona.CODIGOPOSTALNOTIFICACIONES, "Notificaciones"))" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Población: </label>
                                        <input class="form-control" id="txtDireccion" readonly="readonly" value="@nomMuniNoti" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Provincia: </label>
                                        <input class="form-control" id="txtDireccion" readonly="readonly" value="@nomProvNoti" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Telefono 1: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.TELEFONO1" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Telefono 2: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.TELEFONO2" />
                                    </div>
                                    <div class="col-md-6">
                                        <label for="txtsexo" class="fw-bold">Email: </label>
                                        <input class="form-control" id="txtDireccion" @bind-value="@persona.CORREOELECTRONICO" />
                                    </div>
                                </div>
                            </Content>
                        </Tab>
                    </Tabs>



             
                </div>
            </div>
            <div class="row" style="max-height:415px; overflow-y:auto; overflow-x:hidden">
                <Tabs @ref=tabsDtsPer NavStyle="NavStyle.VerticalUnderline" Class="col-md-2" style="margin-top:25px; font-size:12px; gap:0; width:165px; overflow-y:auto" OnShown="@(args => OnTabShownAsync(args))">
                    <Tab Title="Nóminas" Name="tabNominas">
                        <Content>
                            <NominaGrid Persona="persona"></NominaGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Incidencias" Name="tabIncidencias">
                        <Content>
                            <IncidenciaGrid Persona="persona"></IncidenciaGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Enfermedades" Name="tabEnfermedades">
                        <Content>
                            <EnfermedadesGrid Persona="persona"></EnfermedadesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Maternidades/Riesgo Embarazo" Name="tabMaternidades">
                        <Content>
                            <MaternidadesGrid Persona="persona"></MaternidadesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Diferencia Pago Delegado" Name="tabDiferencia">
                        <Content>
                            <DiferenciaGrid Persona="persona"></DiferenciaGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Permisos sin Retribución" Name="tabPermSinRet">
                        <Content>
                            <PermisosSinRetriGrid Persona="persona"></PermisosSinRetriGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Huelgas" Name="tabHuelgas">
                        <Content>
                            <HuelgasGrid Persona="persona"></HuelgasGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Puestos Trabajo" Name="tabPuestos">
                        <Content>
                            <PuestosTrabajoGrid Persona="persona"></PuestosTrabajoGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Otros Datos" Name="tabOtrosDatos">
                        <Content>
                            <OtrosDatosGrid Persona="persona"></OtrosDatosGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Reducciones Jornada" Name="tabRedJorn">
                        <Content>
                            <ReduccionesJornadaGrid Persona="persona"></ReduccionesJornadaGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Trabajadores a Tiempo Parcial" Name="tabTrabTiempoPar">
                        <Content>
                            <TrabajadoresTiempoParcialGrid Persona="persona"></TrabajadoresTiempoParcialGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Sexenios y Quintenios" Name="tabSexeQuinte">
                        <Content>
                            <SexeniosQuinqueniosGrid Persona="persona"></SexeniosQuinqueniosGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Trienios y C. Carrera" Name="tabTriCar">
                        <Content>
                            <TrieniosCarreraGrid Persona="persona"></TrieniosCarreraGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Diferencia de Trienios" Name="tabDifTri">
                        <Content>
                            <DiferenciaTrieniosGrid Persona="persona"></DiferenciaTrieniosGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Préstamos" Name="tabPrestamos">
                        <Content>
                            <PrestamosGrid Persona="persona"></PrestamosGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Retenciones Judiciales" Name="tabRetJudiciales">
                        <Content>
                            <RetencionesJudicialesGrid Persona="persona"></RetencionesJudicialesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Productividad" Name="tabProductividad">
                        <Content>
                            <ProductividadGrid Persona="persona"></ProductividadGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Hijos" Name="tabHijos">
                        <Content>
                            <HijosGrid Persona="persona"></HijosGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Ascendientes" Name="tabAscendientes">
                        <Content>
                            <AscendientesGrid Persona="persona"></AscendientesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Otras Retribuciones" Name="tabOtrasRet">
                        <Content>
                            <OtrasRetribucionesGrid Persona="persona"></OtrasRetribucionesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="IRPF (Situación actual)" Name="tabIRPFAct">
                        <Content>
                            <IRPFActGrid Persona="persona"></IRPFActGrid>
                        </Content>
                    </Tab>
                    <Tab Title="IRPF (Historial Regularizaciones)" Name="tabIRPFhist">
                        <Content>
                            <IRPFHistGrid Persona="persona"></IRPFHistGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Expedientes" Name="tabExpedientes">
                        <Content>
                            <ExpedientesGrid Persona="persona"></ExpedientesGrid>
                        </Content>
                    </Tab>
                    <Tab Title="Permisos" Name="tabPermisos">
                        <Content>
                            <PermisosGrid Persona="persona"></PermisosGrid>
                        </Content>
                    </Tab>
                </Tabs>
            </div>
        </div>
    </div>
</div>
@code {
    // pruebaAle
    [Parameter]
    public string? cl { get; set; } = "";
    public bool mostrar { get; set; } = true;
    public bool mostrarBtn { get; set; } = false;
    List<ENUMERACIONES> ListaSexos = new List<ENUMERACIONES>();
    List<ENUMERACIONES> ListaTipos = new List<ENUMERACIONES>();
    private Modal popupCodigosPostales = default!;
    List<MUNICIPIOS> listaCodigosRepes = new List<MUNICIPIOS>();
    private HttpClient cliente = new HttpClient();
    private static PERSONAS persona = new PERSONAS();
    FICHEROS ficheroFoto = new FICHEROS();
    public string FotoBase64 { get; set; } = "";
    public byte[]? FotoBytes { get; set; }  // Parámetro para la foto
    private string lblNombre = "";
    private EditContext editContext = new EditContext(persona);
    private ValidationMessageStore? messageStore;
    private string errorMessage = "";
    private int CPSELECT { get; set; }
    private List<ENUMERACIONES> lTiposPers = new List<ENUMERACIONES>();
    public List<CODIGOSPOSTALES> lposiblesLocal = new List<CODIGOSPOSTALES>();
    private List<CONTRATOS> lTipoContra = new List<CONTRATOS>();
    private List<ENUMERACIONES> lGrupo = new List<ENUMERACIONES>();
    private List<CUENTASCOTIZACIONPATRONAL> lCuentaCoti = new List<CUENTASCOTIZACIONPATRONAL>();
    private List<ENUMERACIONES> lDepartamento = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> lOcupacion = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> lSexo = new List<ENUMERACIONES>();
    private Tabs tabsDtsPer { get; set; } = new Tabs();
    private Modal popupConfirmacion = default!;
    private Modal popupCodigoPostal = default!;
    public string nomProv { get; set; }
    public string nomMuni { get; set; }
    public string nomProvNoti { get; set; }
    public string nomMuniNoti { get; set; }
    public string origenCP { get; set; }
    public EventCallback<string> OnValidationStateChanged { get; set; }
    List<ToastMessage> mensajes = new List<ToastMessage>();
    List<FieldIdentifier> listaIdentificadores = new List<FieldIdentifier>();
    private void ValidarSelect(ChangeEventArgs e, string fieldName)
    {
        if (e?.Value?.ToString() != "")
        {
            int value = int.Parse(e?.Value?.ToString()!);

            persona?.GetType()?.GetProperty(fieldName)?.SetValue(persona, value);

        }
        else
        {
            persona?.GetType()?.GetProperty(fieldName)?.SetValue(persona, null);
        }
        OnValidationStateChanged.InvokeAsync(fieldName);
    }
    private void ValidarYActualizar(string fieldName)
    {
        OnValidationStateChanged.InvokeAsync(fieldName);
    }
    private void ValidarTodos()
    {
        messageStore?.Clear();
        foreach (var field in persona.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            ValidarCampo(field.Name);
        }
    }
    private void ValidarCampo(string fieldName)
    {
        FieldIdentifier field;
        var rr = listaIdentificadores.FirstOrDefault(x => x.FieldName == fieldName);
        if (rr.FieldName != null)
        {
            field = rr;
        }
        else
        {
            field = new FieldIdentifier(persona, fieldName);
            listaIdentificadores.Add(field);
        }

        messageStore?.Clear(field);

        switch (fieldName)
        {
            case nameof(persona.NIF):
                var nif = persona.NIF;
                if (string.IsNullOrWhiteSpace(persona.NIF))
                {
                    messageStore?.Add(field, "El DNI es obligatorio.");
                }
                else if (!tsUtilidades.Utilidades.ValidateNif(ref nif))
                {
                    messageStore?.Add(field, "El DNI es incorrecto.");
                }
                persona.NIF = nif;
                break;
            case nameof(persona.NOMBRE):
                if (string.IsNullOrWhiteSpace(persona.NOMBRE))
                {
                    messageStore?.Add(field, "El Nombre es obligatorio");
                }
                else if (persona.NOMBRE.Length > 45)
                {
                    messageStore?.Add(field, "El Nombre no puede ser mayor de 45 caracteres");
                }
                break;
            case nameof(persona.APELLIDOS):
                if (string.IsNullOrWhiteSpace(persona.APELLIDOS))
                {
                    messageStore?.Add(field, "El Apellido es obligatorio");
                }
                else if (persona.APELLIDOS.Length > 100)
                {
                    messageStore?.Add(field, "El Apellido no puede ser mayor de 45 caracteres");
                }
                break;
            case nameof(persona.IDSEXO):
                if (persona.IDSEXO == null)
                {
                    messageStore?.Add(field, "El Sexo es obligatorio");
                }
                break;   
           
        }

        if (fieldName == nameof(persona.CODIGOPOSTAL) && string.IsNullOrWhiteSpace(persona.CODIGOPOSTAL))
            messageStore?.Add(field, "El código postal en la sección de contacto es obligatorio.");
        if (fieldName == nameof(persona.CORREOELECTRONICO) &&
            !string.IsNullOrWhiteSpace(persona.CORREOELECTRONICO) &&
            !persona.CORREOELECTRONICO.Contains("@"))
            messageStore?.Add(field, "El correo debe ser válido.");


        editContext.NotifyValidationStateChanged();
    }
    private async void cerrarPopupCP()
    {
        await popupCodigoPostal.HideAsync();
    }
    private async Task SeleccionarCP(string cp, string origen)
    {
        origenCP = origen;
        var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());
        string codigoPostal = cp;
        Expression<Func<CODIGOSPOSTALES, bool>> filtroPue = x => x.CODIGOPOSTAL == codigoPostal;
        var PueExpression = serializer.SerializeText(filtroPue);
        var PuejsonContent = JsonConvert.SerializeObject(new { Expression = PueExpression });
        var Puecontent = new StringContent(PuejsonContent, Encoding.UTF8, "application/json");
        var Pueresponse = await cliente.PostAsync("/api/CODIGOSPOSTALES/CodigosPostalesFiltrado", Puecontent);
        var PueCont = await Pueresponse.Content.ReadAsStringAsync();
        if (!Pueresponse.IsSuccessStatusCode)
        {
            Console.WriteLine($"Error al obtener CODIGOSPOSTALES: {Pueresponse.StatusCode}, {PueCont}");
            return;
        }
        lposiblesLocal = JsonConvert.DeserializeObject<List<CODIGOSPOSTALES>>(PueCont) ?? new List<CODIGOSPOSTALES>();

        if (lposiblesLocal.Count == 0 && cp == "")
        {
            if (origenCP == "contacto")
            {
                persona.CODIGOPOSTAL = null;
                persona.CODIGOMUNICIPIO = null;
                nomMuni = "";
                nomProv = "";               
            }
            if (origenCP == "Notificaciones")
            {
                persona.CODIGOPOSTALNOTIFICACIONES = null;
                persona.CODIGOMUNICIPIONOTIFICACION = null;
                nomMuniNoti = "";
                nomProvNoti = "";
            }
            StateHasChanged();
        }
        else if (lposiblesLocal.Count == 0)
        {
            if (origenCP == "contacto")
            {
                persona.CODIGOPOSTAL = null;
                persona.CODIGOMUNICIPIO = null;
                nomMuni = "";
                nomProv = "";
            }
            if (origenCP == "Notificaciones")
            {
                persona.CODIGOPOSTALNOTIFICACIONES = null;
                persona.CODIGOMUNICIPIONOTIFICACION = null;
                nomMuniNoti = "";
                nomProvNoti = "";
            }
            mensajes.Add(new ToastMessage
            {
                Type = ToastType.Danger,

                Message = "Código postal no válido",

            });
            editContext.NotifyValidationStateChanged();
             StateHasChanged();
        }
        else if (lposiblesLocal.Count == 1)
        {
            if (origenCP == "contacto")
            {
                persona.CODIGOPOSTAL = lposiblesLocal.First().CODIGOPOSTAL;
                persona.CODIGOMUNICIPIO = lposiblesLocal.First().CODIGOMUNICIPIO;
                nomMuni = lposiblesLocal.First().CODIGOMUNICIPIONavigation.NOMBRE;
                nomProv = lposiblesLocal.First().CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation.NOMBRE;
                StateHasChanged();
            }
            if (origenCP == "Notificaciones")
            {
                persona.CODIGOPOSTALNOTIFICACIONES = lposiblesLocal.First().CODIGOPOSTAL;
                persona.CODIGOMUNICIPIONOTIFICACION = lposiblesLocal.First().CODIGOMUNICIPIO;
                nomMuniNoti = lposiblesLocal.First().CODIGOMUNICIPIONavigation.NOMBRE;
                nomProvNoti = lposiblesLocal.First().CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation.NOMBRE;
                StateHasChanged();
            }
        }
        else
        {

            await popupCodigoPostal.ShowAsync();
        }


    }
    private void setCP()
    {


        var seleccionado = lposiblesLocal.FirstOrDefault(x => x.IDCODIGOPOSTAL == CPSELECT);
        if (origenCP == "contacto")
        {
            persona.CODIGOPOSTAL = seleccionado.CODIGOPOSTAL;
            persona.CODIGOMUNICIPIO = seleccionado.CODIGOMUNICIPIO;
            nomMuni = seleccionado.CODIGOMUNICIPIONavigation.NOMBRE;
            nomProv = seleccionado.CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation.NOMBRE;
            cerrarPopupCP();
            StateHasChanged();
        }
        if (origenCP == "Notificaciones")
        {
            persona.CODIGOPOSTALNOTIFICACIONES = seleccionado.CODIGOPOSTAL;
            persona.CODIGOMUNICIPIONOTIFICACION = seleccionado.CODIGOMUNICIPIO;
            nomMuniNoti = seleccionado.CODIGOMUNICIPIONavigation.NOMBRE;
            nomProvNoti = seleccionado.CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation.NOMBRE;
            cerrarPopupCP();
            StateHasChanged();
        }
    }
    private async Task GuardarPersona()
    {
        CerrarConfirmacion();
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        ValidarTodos();
        if (!editContext.GetValidationMessages().Any())

        {
            persona.AÑOCAMBIORESIDENCIA = 0;

            //Te quedaste en que tienes que coger la foto del navigation y guardarla (Por cierto el nuevo no aparece en la lista)
            if (persona.IDFICHEROFOTONavigation != null)
            {
                FICHEROS fi = persona.IDFICHEROFOTONavigation;
                if (persona.IDFICHEROFOTO != null)
                {
                    var responsef = await Utilidades.ActualizarObjeto(cliente, "/api/FICHEROS/" + fi.IDFICHERO, fi);
                    //persona.IDFICHEROFOTO = responsef.IDFICHERO;

                }
                else

                {
                    var responsef = await Utilidades.NuevoObjeto(cliente, "/api/FICHEROS", fi);
                    persona.IDFICHEROFOTO = responsef.IDFICHERO;
                }
            }

            if (persona.IDPERSONA == 0)//Nuevo
            {

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

            }
            else//Actualizar
            {
                var personaGuardar = persona;
                personaGuardar.NOMINATRABAJADORCABECERA = null;
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/PERSONAS/" + personaGuardar.IDPERSONA, personaGuardar);
                var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
                if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue)) { cl = clValue; }
                cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
                string nifDesencriptado = tsUtilidades.crypt.FEncS(cl,
                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                    -875421649);
                var response = await cliente.GetAsync($"/api/PERSONAS/PersonaNominaNif/{nifDesencriptado}");
                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception($"Error al obtener los datos de la persona. Código: {response.StatusCode}");
                }

                var resultContent = await response.Content.ReadAsStringAsync();
                persona = JsonConvert.DeserializeObject<PERSONAS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
                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,

            });
            editContext.NotifyValidationStateChanged();

        }

    }  
    private async Task CerrarConfirmacion()
    {
        await popupConfirmacion.HideAsync();
    }
    private async Task abrirGuardar()
    {
        await popupConfirmacion.ShowAsync();
    }
    private async Task OnTabShownAsync(TabsEventArgs args)
    {
        var panelActivo = args.ActiveTabName;

        await ProtectedSessionStore.SetAsync("ultiTabNom", panelActivo);

    }
    private async Task CargarSelects()
    {
        try
        {

            lTiposPers = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPPER");
            lGrupo = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/GRUPOFUNCIONARIO");
            lDepartamento = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/DEP");
            lOcupacion = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/OCUP");
            lSexo = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/SEXO");
            // lTipoContra = await Utilidades.ObtenerObjeto<List<CONTRATOS>>(cliente, "/api/CONTRATOS");
            var responseTipCon = await cliente.GetAsync("/api/CONTRATOS/");
            if (responseTipCon.IsSuccessStatusCode) { lTipoContra = JsonConvert.DeserializeObject<List<CONTRATOS>>(await responseTipCon.Content.ReadAsStringAsync()); }
            var responseCoti = await cliente.GetAsync("/api/CUENTASCOTIZACIONPATRONAL");
            if (responseCoti.IsSuccessStatusCode) { lCuentaCoti = JsonConvert.DeserializeObject<List<CUENTASCOTIZACIONPATRONAL>>(await responseCoti.Content.ReadAsStringAsync()); }
            StateHasChanged();
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            Console.WriteLine($"Error durante la inicialización: {ex.Message}");
            mostrar = false;
        }

    }
    protected async override Task OnParametersSetAsync()
    {
        await ObtenerFoto();
    }
    protected override async Task OnInitializedAsync()
    {
        try
        {
            var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
     
            if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
            {
                cl = clValue;
            }

            if (string.IsNullOrEmpty(cl))
            {
                persona = new PERSONAS();
                mostrarBtn = true;
            }

            cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
            ListaSexos = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/SEXO");
            string nifDesencriptado = tsUtilidades.crypt.FEncS(cl,
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                -875421649);
        
            var response = await cliente.GetAsync($"/api/PERSONAS/PersonaNominaNif/{nifDesencriptado}");
            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Error al obtener los datos de la persona. Código: {response.StatusCode}");
            }

            var resultContent = await response.Content.ReadAsStringAsync();
            persona = JsonConvert.DeserializeObject<PERSONAS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
            lblNombre = persona.NOMBRE + " " + persona.APELLIDOS;
            nomMuni = persona.NombrePoblacion;
            nomProv = persona.NombreProvincia;
            nomMuniNoti = persona.NombrePoblacionNotificaciones;
            nomProvNoti = persona.NombreProvinciaNotificaciones;
            editContext = new EditContext(persona);
            messageStore = new ValidationMessageStore(editContext);

            mostrar = false;
            await CargarSelects();
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            Console.WriteLine($"Error durante la inicialización: {ex.Message}");
            mostrar = false;
        }
        finally
        {
            mostrar = false;
        }
    }
    protected void volver() { Navigation.NavigateTo("/ListTrabajadores", forceLoad: true); }
    private async Task ObtenerFoto()
    {
        try
        {
            if (persona.IDFICHEROFOTO.HasValue)
            {
                // Crear el cliente utilizando la utilidad
                var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

                // Construir la URI para el endpoint del fichero
                string baseUri = Utilidades.urlSwagger();
                string uri = $"{baseUri}FICHEROS/{persona.IDFICHEROFOTO}";

                // Usar la utilidad para obtener el fichero
                ficheroFoto = await Utilidades.ObtenerObjeto<FICHEROS>(client, uri);

                if (ficheroFoto?.FICHERO != null)
                {
                    FotoBase64 = Convert.ToBase64String(ficheroFoto.FICHERO);
                }
                else
                {
                    FotoBase64 = "";
                    Console.WriteLine("No se encontró una foto asociada al ID.");
                }

            }
            else
            {
                Console.WriteLine("La persona no tiene un ID de foto asociado.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al cargar la foto: {ex.Message}");
        }
    }
    private string GetCssClass(string fieldName)
    {
        if (messageStore == null)
        {
            return "";
        }

        var field = new FieldIdentifier(persona, fieldName);
        return messageStore != null && messageStore[field].Any() ? "is-invalid" : string.Empty;
    }
    private async Task ProcesarImagen(InputFileChangeEventArgs e)
    {
        try
        {
            // Obtén el archivo seleccionado
            IBrowserFile archivo = e.File;

            if (archivo != null)
            {
                // Define el tamaño máximo permitido (por ejemplo, 10 MB)
                const long maxFileSize = 10 * 1024 * 1024;

                // Lee el archivo como un stream
                using var stream = archivo.OpenReadStream(maxFileSize);
                using var memoryStream = new MemoryStream();
                await stream.CopyToAsync(memoryStream);

                // Convierte el archivo a Base64
                //FotoBase64 = Convert.ToBase64String(memoryStream.ToArray());
                FotoBytes = memoryStream.ToArray();

                if (FotoBytes != null)
                {
                    FICHEROS fichero = new FICHEROS();
                    if (ficheroFoto != null)
                    {
                        fichero = ficheroFoto;
                    }

                    fichero.DESCRIPCION = "FOTO PERSONA";
                    fichero.FECHA = DateTime.Now;
                    fichero.NOMBREFICHERO = "foto.png";
                    fichero.FICHERO = FotoBytes;

                    persona.IDFICHEROFOTONavigation = fichero;
                    FotoBase64 = Convert.ToBase64String(FotoBytes);
                }
                // Forza la actualización del componente
                StateHasChanged();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error al procesar la imagen: {ex.Message}");
        }
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        if (messageStore == null)
        {
            return "";
        }

        var field = new FieldIdentifier(persona, fieldName);
        return messageStore[field]?.FirstOrDefault() ?? string.Empty;
    }



}
<script>


    function obtenerCheck(id){
       return $("#"+id)[0].checked
    }
</script>
