@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 Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage

@rendermode InteractiveServer
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore

<div class="datos-administrativos-container mt-3">
    <!-- Primera fila con 4 columnas -->
    <div class="row  ">
        <div class="col-md-3">
            <label class="lblInput" for="fecha-alta">Fecha alta Oficina: *</label>
            <input type="date" class="form-control  @GetCssClass(nameof(Persona.FECHAALTA))"
                   id="fecha-alta"
                   @bind-value="Persona.FECHAALTA"
                   placeholder="@GetPlaceholder(nameof(Persona.NIF))"
                   @oninput="e => ValidarYActualizar(e, nameof(Persona.NIF))" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="fecha-baja">Fecha baja Oficina:</label>
            <input type="date" class="form-control" id="fecha-baja" @bind-value="Persona.FECHABAJA" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="causa-baja">Causa baja:</label>
            <InputSelect @bind-Value="Persona.IDCAUSADEBAJA" class="form-select">
                <option value="">Seleccionar</option>
                @foreach (var enumera in listadoCausaBaja)
                {
                    <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="fecha-jubilacion">Fecha prevista jubilación:</label>
            <input type="date" class="form-control" id="fecha-jubilacion" @bind-value="Persona.FECHAPOSIBLEJUBILACION" />
        </div>
    </div>
    <!-- Segunda fila con 5 columnas -->
    <div class="row">
        <div class="col-md-4">
            <label class="lblInput" for="cuerpo">Cuerpo:</label>
            <InputSelect @bind-Value="Persona.IDCUERPORPT" class="form-select">
                <option value="">Seleccionar</option>
                @foreach (var cuerpo in listadoCuerpos)
                {
                    <option value="@cuerpo.IDCUERPO">@cuerpo.DESCRIPCION</option>
                }
            </InputSelect>
        </div>       
        <div class="col-md-4">
            <label class="lblInput" for="clase-personal">Clase personal:</label>
            <InputSelect @bind-Value="Persona.IDADSCRIPCIONRPT" class="form-select" @onchange="e =>ValidarSelect(e,nameof(Persona.IDADSCRIPCIONRPT))">
                <option value="">Seleccionar</option>
                @foreach (var persona in listadoPersonal)
                {
                    <option value="@persona.IDTIPO">@persona.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-4">
            <label class="lblInput" for="grado-personal">Grado Personal Consolidado:</label>
            <InputSelect disabled @bind-Value="Persona.IDGRADOPERSONALCONSOLIDADO" class="form-select">
                <option value="">-</option>
                @foreach (var nivel in listadoNivel)
                {
                    <option value="@nivel.IDNIVEL">@nivel.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
    </div>
    <!-- Tercera fila con 5 columnas -->
    <div class="row">
        <div class="col-md-2">
            <label class="lblInput" for="fecha-consolidacion">Fecha Consolidación:</label>
            <input type="date" disabled class="form-control" id="fecha-consolidacion" @bind-value="Persona.FECHACONSOLIDACIONGRADO" />
        </div>
        <div class="col-md-2">
            <label class="lblInput" for="tramo-carrera">Tramo Carrera Horizontal:</label>
            <InputSelect  @bind-Value="IDTRAMOCOMCAR" class="form-select" disabled>
                <option value="">-</option>
                @foreach (var trm in listadotramos)
                {
                    <option value="@trm.IDENUMERACION">@trm.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-2">
            <label class="lblInput" for="fecha-reconocimiento">Fecha Reconocimiento Carrera Horizontal:</label>
            <input type="date" class="form-control" id="fecha-reconocimiento" @bind-value="Persona.FECHACUMPLIMIENTOCARRERA" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="numero-trienios">Número Trienios:</label>
            <input class="form-control" id="numero-trienios" @bind-value="@NumeroTrienios" disabled />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="fecha-cumplimiento">Fecha Cumplimiento Próximo Trienio @if(Persona.IDPERSONA == 0){ <span style='color:red'>*</span>; }:</label>
            @if(Persona.IDPERSONA == 0)
            {
                <input type="date" class="form-control  @GetCssClass(nameof(Persona.FECHACUMPLIMIENTOPROXTRIENIO))"
                       id="fecha-alta"
                       @bind-value="Persona.FECHACUMPLIMIENTOPROXTRIENIO"
                       placeholder="@GetPlaceholder(nameof(Persona.FECHACUMPLIMIENTOPROXTRIENIO))"
                       @oninput="e => ValidarYActualizar(e, nameof(Persona.FECHACUMPLIMIENTOPROXTRIENIO))" />
                @* <input type="date" class="form-control" @bind-value="Persona.FECHACUMPLIMIENTOPROXTRIENIO" id="fecha-cumplimiento" /> *@
            }
            else
            {
                <input type="date" disabled class="form-control" id="fecha-cumplimiento" @bind-value="Persona.FECHACUMPLIMIENTOPROXTRIENIO" />
            }

           
        </div>
    </div>
    <!-- cuarta fila con 4 columnas -->
    <div class="row  ">
        <div class="col-md-3">
            <label class="lblInput" for="fecha-alta">Mutua 1:</label>
            <InputSelect @bind-Value="Persona.IDMUTUA" class="form-select">
                <option value=""></option>
                @foreach (var enumera in listadoMutua)
                {
                    <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                }
           </InputSelect>
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="fecha-alta">Mutua 2:</label>
            <InputSelect @bind-Value="Persona.IDMUTUA2" class="form-select">
                <option value=""></option>
                   @foreach (var enumera in listadoMutua)
                {
                <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="causa-baja"> Numero de afiliciación mutua 1:</label>
            <input type="text" class="form-control"  @bind-value="Persona.NUMEROAFILIACIONMUTUA" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="causa-baja"> Numero de afiliciación mutua 2:</label>
            <input type="text" class="form-control" @bind-value="Persona.NUMEROAFILIACIONMUTUA2" />
        </div>
    </div>
    <!-- quinta fila con 4 columnas -->
    <div class="row  ">
        <div class="col-md-3">
            <label class="lblInput" for="fecha-alta">Importe seguro de accidentes:</label>
            <input type="text" class="form-control" @bind-value="Persona.IMPORTEDECUCCIONGRUPO" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="fecha-alta">cuenta bancaria:</label>
            <input type="text" class="form-control" @bind-value="Persona.CUENTABANCARIA" @oninput="QuitarEspacios" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="causa-baja"> Porcentaje de pluriempleo:</label>
            <input type="text" class="form-control" @bind-value="Persona.PLURIEMPLEO" />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="causa-baja"> número de pluriempleo:</label>
            <input type="text" class="form-control" @bind-value="Persona.NUMEROPLURIEMPLEO" />
        </div>
    </div>
    <!-- Relación Oficina -->
    <h5 class="mt-4">RELACIÓN OFICINA</h5>
    <div class="row border p-3  ">
        <div class="col-md-2">
            <label class="lblInput" for="situacion-administrativa">Situación administrativa:</label>
            <InputSelect @bind-Value="Persona.IDSITUACIONADMINISTRATIVARPT" class="form-select">
                <option value="">Seleccionar</option>
                @foreach (var situAdm in listadoSituacionAdm)
                {
                    <option value="@situAdm.IDSITUACION">@situAdm.LITERAL_SITUACION</option>
                }
            </InputSelect>
        </div>
        <div class="col-md-4">
            <label class="lblInput" for="unidad-administrativa">Departamento:</label>
            <input class="form-control" id="unidad-administrativa" value="@Persona.DEPARTAMENTOACTUAL" disabled />
        </div>
      @*   <div class="col-md-2">
            <label class="lblInput" for="unidad-administrativa">Unidad administrativa:</label>
            <input class="form-control" id="unidad-administrativa" value="@Persona.DEPARTAMENTOACTUAL" disabled />
        </div>
        <div class="col-md-2">
            <label class="lblInput" for="servicio-adscrito">Servicio adscrito:</label>
            <input class="form-control" id="servicio-adscrito" value="@Persona.SERVICIOADSCRITO" disabled />
        </div> *@
        <div class="col-md-3">
            <label class="lblInput" for="puesto-actual">Puesto Actual:</label>
            <input class="form-control" id="puesto-actual" value="@Persona.PUESTOACTUAL" disabled />
        </div>
        <div class="col-md-3">
            <label class="lblInput" for="caracter-ocupacion">Carácter de Ocupación:</label>
            <input class="form-control" id="caracter-ocupacion" value="@Persona.CAROCUACTUAL" disabled />
        </div>
    </div>
    <!-- Tabs adicionales -->
    @if (Persona.IDPERSONA != 0)
    {
        <Tabs @ref=tabsDtsAdm style="margin-top:25px" OnShown="@(args => OnTabShownAsync(args))">
            <Tab Title="Puestos" Name="tabPuestos">
                <Content>
                    <PuestosGrid Persona="Persona"></PuestosGrid>
                </Content>
            </Tab>
            <Tab Title="Vida Administrativa" Name="tabVidAdm">
                <Content>
                    <VidaAdministrativaGrid Persona="Persona"></VidaAdministrativaGrid>
                </Content>
            </Tab>
            <Tab Title="Consolidación de Grado" Name="tabConsoGrado">
                <Content>
                    <ConsolidacionGradoGrid Persona="Persona" OnPersonaActualizada="RefrescarFormulario"></ConsolidacionGradoGrid>
                </Content>
            </Tab>
            <Tab Title="Formación" Name="tabFormacion">
                <Content>
                    <FormacionGrid Persona="Persona"></FormacionGrid>
                </Content>
            </Tab>
                   <Tab Title="Docencia" Name="tabDocencia">
                <Content>
                    <DocenciaGrid Persona="Persona"></DocenciaGrid>
                </Content>
            </Tab>

            <Tab Title="Idiomas" Name="tabIdiomas">
                <Content>
                    <IdiomasGrid Persona="Persona"></IdiomasGrid>
                </Content>
            </Tab>

            <Tab Title="Trienios" Name="tabTrienios">
                <Content>
                    <TrieniosGrid Persona="Persona" OnPersonaActualizada="RefrescarFormulario"></TrieniosGrid>
                </Content>
            </Tab>

            <Tab Title="Complementos Carrera" Name="tabCompleCarrera">
                <Content>
                    <ComplementosCarreraGrid Persona="Persona" OnPersonaActualizada="RefrescarFormulario"></ComplementosCarreraGrid>
                </Content>
            </Tab>

            <Tab Title="Otras Retribuciones" Name="tabOtraRetri">
                <Content>
                    <OtrasRetribucionesGrid></OtrasRetribucionesGrid>
                </Content>
            </Tab>

            <Tab Title="Titulaciones" Name="tabTitulaciones">
                <Content>
                    <TitulacionesGrid Persona="Persona"></TitulacionesGrid>
                </Content>
            </Tab>
        </Tabs>
    }
</div>

@code {
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();
    [Parameter]
    public EventCallback<string> OnValidationStateChanged { get; set; }
    [Parameter]
    public ValidationMessageStore? messageStore { get; set; }
    private Tabs tabsDtsAdm { get; set; } = new Tabs();

    private async Task OnTabShownAsync(TabsEventArgs args)
    {
        var panelActivo = args.ActiveTabName;

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

    }
    // LISTADOS PARA COMBOBOX
    private List<CUERPO> listadoCuerpos = new List<CUERPO>();
    private List<SITUACION> listadoSituacionAdm = new List<SITUACION>();
    private List<TIPOS_PERSONAL> listadoPersonal = new List<TIPOS_PERSONAL>();
    private List<NIVEL> listadoNivel = new List<NIVEL>();
    private List<COMPLEMENTOSCARRERA> listadoComCar = new List<COMPLEMENTOSCARRERA>();
    private List<ENUMERACIONES> listadotramos = new List<ENUMERACIONES>();
    private int? IDTRAMOCOMCAR { get; set; }
    private string? inputCuentaBancaria { get; set; }
    private DateTime? FECHACOMCAR { get; set; }
    private List<ENUMERACIONES> listadoCausaBaja = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> listadoMutua  = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> listadoEscala = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> listadoEspecialidad = new List<ENUMERACIONES>();
    private PUESTOS puestoQueOcupa { get; set; } = new PUESTOS();
    private HttpClient cliente = new HttpClient();

    private int NumeroTrienios { get; set; }
    private void RefrescarFormulario()
    {
        CalcularNumeroTrienios();
        CargarCompCar();
        StateHasChanged();
    }

    private void QuitarEspacios(ChangeEventArgs e)
    {
        Persona.CUENTABANCARIA = e.Value?.ToString().Replace(" ", "");
        StateHasChanged();
    }

    private async Task CargarCompCar()
    {
        listadoComCar = await Utilidades.ObtenerObjeto<List<COMPLEMENTOSCARRERA>>(cliente, "/api/COMPLEMENTOSCARRERA/GruposEnumExtend/" + Persona.IDPERSONA);
        listadoComCar = listadoComCar.OrderBy(x => x.FECHAINICIO).ToList();
        IDTRAMOCOMCAR = listadoComCar.First().IDTRAMO;
        FECHACOMCAR = listadoComCar.First().FECHAINICIO;
        StateHasChanged();
    }
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            var nombreTabsActivo = await ProtectedSessionStore.GetAsync<string>("ultiTabDtAdm");

            if (nombreTabsActivo.Value != null && tabsDtsAdm != null)
            {
                await tabsDtsAdm.ShowTabByNameAsync(nombreTabsActivo.Value);
            }
        }
    }
    protected override async Task OnInitializedAsync()
    {
        try
        {

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

            await rellenarListados();
            CargarCompCar();
            listadoCausaBaja = await rellenarLitadoEnum("CAUBAJ");
            listadoEscala = await rellenarLitadoEnum("ESCALAS");
            listadoEspecialidad = await rellenarLitadoEnum("ESPECIALIDADES");
            listadoMutua = await rellenarLitadoEnum("MUT");
            listadotramos = await rellenarLitadoEnum("TRAMCOMCARR");
            
            await CalcularNumeroTrienios();


        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task CalcularNumeroTrienios()
    {
        try
        {
            // Realiza la petición al endpoint para obtener los trienios asociados a la persona
            var response = await cliente.GetAsync($"/api/TRIENIOS/GetWithIncludes/{Persona.IDPERSONA}");

            if (response.IsSuccessStatusCode)
            {
                // Deserializa la respuesta a una lista de trienios
                var trienios = JsonConvert.DeserializeObject<List<TRIENIOS>>(await response.Content.ReadAsStringAsync());

                // Suma los valores de TOA y TC, manejando los valores nulos
                NumeroTrienios = trienios!.Sum(x => x.TOA.GetValueOrDefault() + x.TC.GetValueOrDefault());
                StateHasChanged();
            }
            else
            {
                Console.WriteLine($"Error al obtener los trienios: {response.StatusCode}");
            }
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al calcular los trienios: {e.Message}");
        }
    }

    // RELLENAR LISTAS
    private async Task rellenarListados()
    {
        try
        {
            List<string> listadosAEncontrar = new List<string>()
            {
                "CUERPO", "SITUACION", "TIPOS_PERSONAL", "NIVEL"
            };

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

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

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

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

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

                        case "NIVEL":
                            listadoNivel = JsonConvert.DeserializeObject<List<NIVEL>>(resultContent) ?? new List<NIVEL>();
                            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<List<ENUMERACIONES>> rellenarLitadoEnum(string buscarGrupo)
    {
        try
        {
            Expression<Func<ENUMERACIONES, bool>> filtro = x => x.IDGRUPOENUMERACIONNavigation!.GRUPO == buscarGrupo;

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

            return enumsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }
    //
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();

        //Persona.GetType().GetProperty(fieldName).SetValue(Persona, value);

        OnValidationStateChanged.InvokeAsync(fieldName);
    }
    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 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 string GetPlaceholder(string fieldName)
    {
        if (messageStore == null)
        {
            return "";
        }

        var field = new FieldIdentifier(Persona, fieldName);
        return messageStore[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        if (messageStore == null)
        {
            return "";
        }

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