@using BlazorBootstrap
@using System.Reflection
@using bdAntifraude.db
@using Models
@using System.Linq.Expressions
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject IJSRuntime JSRuntime

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

<div class="datos-personales-container mt-3">
    <div>
        <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">
                        @if (!string.IsNullOrEmpty(FotoBase64))
                        {
                            <img src="data:image/jpeg;base64,@FotoBase64" alt="Foto de la persona" style="width: auto; height: 100%; 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">
                    <div class="row mb-3">
                        <!-- Otros campos del formulario -->
                        <div class="col-md-3">
                            <label for="dni" class="fw-bold">DNI: *</label>
                            <input class="form-control @GetCssClass(nameof(Persona.NIF))"
                                   id="dni"
                                   @bind-value="@Persona.NIF"
                                   placeholder="@GetPlaceholder(nameof(Persona.NIF))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.NIF))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.NIF))</div>
                        </div>
                        <div class="col-md-3">
                            <label for="nombre" class="fw-bold">Nombre: *</label>
                            <input class="form-control @GetCssClass(nameof(Persona.NOMBRE))"
                                   id="nombre"
                                   @bind-value="@Persona.NOMBRE"
                                   placeholder="@GetPlaceholder(nameof(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="apellidos" class="fw-bold">Apellidos: *</label>
                            <input class="form-control @GetCssClass(nameof(Persona.APELLIDOS))"
                                   id="apellidos"
                                   @bind-value="@Persona.APELLIDOS"
                                   placeholder="@GetPlaceholder(nameof(Persona.APELLIDOS))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.APELLIDOS))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.APELLIDOS))</div>
                        </div>
                        <div class="col-md-2 gap-2 align-items-center d-flex justify-content-center">
                            <label for="externo" class="fw-bold">Externo:</label>
                            <input type="checkbox" class="form-check-input" id="externo" @bind="Persona.CEUTAMELILLA" />
                        </div>
                    </div>
                    <div class="row mb-3">
                        <div class="col-md-2">
                            <label for="nss" class="fw-bold">Nº Seg Social:</label>
                            <input class="form-control @GetCssClass(nameof(Persona.NUMEROAFILIACIONMUTUA))"
                                   id="nss"
                                   @bind-value="@Persona.NUMEROAFILIACIONMUTUA"
                                   placeholder="@GetPlaceholder(nameof(Persona.NUMEROAFILIACIONMUTUA))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.NUMEROAFILIACIONMUTUA))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.NUMEROAFILIACIONMUTUA))</div>
                        </div>
                        <div class="col-md-2">
                            <label for="sexo" class="fw-bold">Sexo: *</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 class="validation-message">@GetExternalValidationMessage(nameof(Persona.IDSEXO))</div>
                        </div>
                        <div class="col-md-3">
                            <label for="fecha-nacimiento" class="fw-bold">Fec. Nacimiento:</label>
                            <input type="date" class="form-control @GetCssClass(nameof(Persona.FECHANACIMIENTO))"
                                   id="fecha-nacimiento"
                                   @bind-value="@Persona.FECHANACIMIENTO"
                                   placeholder="@GetPlaceholder(nameof(Persona.FECHANACIMIENTO))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.FECHANACIMIENTO))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.FECHANACIMIENTO))</div>
                        </div>
                        <div class="col-md-5">
                            <label for="domicilio" class="fw-bold">Domicilio:</label>
                            <input class="form-control @GetCssClass(nameof(Persona.DOMICILIO))"
                                   id="domicilio"
                                   @bind-value="@Persona.DOMICILIO"
                                   placeholder="@GetPlaceholder(nameof(Persona.DOMICILIO))"
                                   @onblur="e => ValidarYActualizar( nameof(Persona.DOMICILIO))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.DOMICILIO))</div>
                        </div>
                    </div>
                    <div class="row mb-3">
                        <div class="col-md-2">
                            <label for="codigo-postal" class="fw-bold">C. Postal: *</label>
                            <input class="form-control @GetCssClass(nameof(Persona.CODIGOPOSTAL))"
                                   id="codigo-postal"
                                   @bind-value="@Persona.CODIGOPOSTAL"
                                   placeholder="@GetPlaceholder(nameof(Persona.CODIGOPOSTAL))"
                                   @onblur="e => ValidarCodigoPostal()" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.CODIGOPOSTAL))</div>
                        </div>
                        <div class="col-md-2">
                            <label for="poblacion" class="fw-bold">Población:</label>
                            <input class="form-control" id="poblacion" value="@Persona.CODIGOMUNICIPIONavigation?.NOMBRE" disabled />
                        </div>
                        <div class="col-md-2">
                            <label for="provincia" class="fw-bold">Provincia:</label>
                            <input class="form-control" id="provincia" value="@Persona.CODIGOMUNICIPIONavigation?.CODIGOPROVINCIANavigation?.NOMBRE" disabled />
                        </div>
                        <div class="col-md-2">
                            <label for="telefono" class="fw-bold">Teléfono:</label>
                            <input class="form-control @GetCssClass(nameof(Persona.TELEFONO1))"
                                   id="telefono"
                                   @bind-value="@Persona.TELEFONO1"
                                   placeholder="@GetPlaceholder(nameof(Persona.TELEFONO1))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.TELEFONO1))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.TELEFONO1))</div>
                        </div>
                        <div class="col-md-4">
                            <label for="correo-electronico" class="fw-bold">Correo Electrónico:</label>
                            <input class="form-control @GetCssClass(nameof(Persona.CORREOELECTRONICO))"
                                   id="correo-electronico"
                                   @bind-value="@Persona.CORREOELECTRONICO"
                                   placeholder="@GetPlaceholder(nameof(Persona.CORREOELECTRONICO))"
                                   @onblur="e => ValidarYActualizar(nameof(Persona.CORREOELECTRONICO))" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Persona.CORREOELECTRONICO))</div>
                        </div>
                    </div>
                </div>
            </div>


        </div>
    </div>
</div>
<script>
    function AbrirSelectorImagen() {
        document.getElementById("fileInput").click()

    }
</script>

<!-- Tabs -->
@if (Persona.IDPERSONA != 0)
{
    <Tabs>
        <Tab Title="Familia" Active="true">
            <Content>
                <FamiliaGrid Persona="Persona"></FamiliaGrid>
            </Content>
        </Tab>
        <Tab Title="Vehículos">
            <Content>
                <VehiculosGrid Persona="Persona"></VehiculosGrid>
            </Content>
        </Tab>
    </Tabs>
}
<Modal @ref="popupCodigosPostales" title="Codigo Duplicado" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">
            <p>El codigo esta duplicado, seleccione a que municipio pertenece</p>
            <label class="tituloLbl">Municipio:</label>
            <InputSelect @bind-Value="Persona.CODIGOMUNICIPIO" class="inputForm">
                @foreach (var gru in listaCodigosRepes)
                {
                    <option value="@gru.CODIGOMUNICIPIO">@gru.NOMBRE</option>
                }
            </InputSelect>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button @onclick="@(() => CerrarPopupCodigoPostal())" Color="ButtonColor.Primary">Aceptar</Button>
    </FooterTemplate>
</Modal>
@* </EditForm> *@

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

    List<ENUMERACIONES> ListaSexos = new List<ENUMERACIONES>();
    private Modal popupCodigosPostales = default!;
    List<MUNICIPIOS> listaCodigosRepes = new List<MUNICIPIOS>();
    private HttpClient cliente = new HttpClient();

    FICHEROS ficheroFoto = new FICHEROS();
    public string FotoBase64 { get; set; } = "";
    public byte[]? FotoBytes { get; set; }  // Parámetro para la foto


    protected async override Task OnParametersSetAsync()
    {
        await ObtenerFoto();
    }

    protected override async Task OnInitializedAsync()
    {
        StateHasChanged(); // Forzar renderizado tras cargar la foto

        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        ListaSexos = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/SEXO");
    }


    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 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 void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    // {
    //     var value = e.Value?.ToString();

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

    //     OnValidationStateChanged.InvokeAsync(fieldName);
    // }
    private void ValidarYActualizar(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 async Task ValidarCodigoPostal()
    {
        if (Persona.CODIGOPOSTAL != "")
        {
            Expression<Func<CODIGOSPOSTALES, bool>> filtro = x => x.CODIGOPOSTAL == Persona.CODIGOPOSTAL;
            List<CODIGOSPOSTALES> listaCodigos = await Utilidades.ObtenerObjeto<List<CODIGOSPOSTALES>>(cliente, "/api/CODIGOSPOSTALES/MunicipiosExtend/", filtro);
            if (listaCodigos == null || listaCodigos.Count() == 0)
            {
                FieldIdentifier field = new FieldIdentifier(Persona, "CODIGOPOSTAL");
                messageStore?.Add(field, "El Codigo Postal no existe.");
            }
            else if (listaCodigos.Count() == 1)
            {
                var cp = listaCodigos.First();
                Persona.CODIGOPOSTAL = cp.CODIGOPOSTAL;
                Persona.CODIGOMUNICIPIONavigation = cp.CODIGOMUNICIPIONavigation;
                Persona.CODIGOMUNICIPIO = cp.CODIGOMUNICIPIO;
                Persona.CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation = cp.CODIGOMUNICIPIONavigation.CODIGOPROVINCIANavigation;
            }
            else
            {
                listaCodigosRepes.Clear();
                foreach (var cp in listaCodigos)
                { listaCodigosRepes.Add(cp?.CODIGOMUNICIPIONavigation!); }
                Persona.CODIGOMUNICIPIO = listaCodigosRepes?.FirstOrDefault()?.CODIGOMUNICIPIO;
                // Persona.CODIGOMUNICIPIONavigation.CODIGOPROVINCIA = listaCodigosRepes?.FirstOrDefault()?.CODIGOPROVINCIANavigation?.CODIGOPROVINCIA;
                await popupCodigosPostales.ShowAsync();
            }
        }
        else { Persona.CODIGOMUNICIPIONavigation = null; }
    }
    private async Task CerrarPopupCodigoPostal()
    {
        Persona.CODIGOMUNICIPIONavigation = listaCodigosRepes.First(x => x.CODIGOMUNICIPIO == Persona.CODIGOMUNICIPIO);
        await popupCodigosPostales.HideAsync();
    }

    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;
    }
}
