@page "/Buscador"
@rendermode InteractiveServer
@attribute [Authorize]

@using System.Linq
@using GestionaDenunciasAN.Models
@using GestionaDenunciasAN.Services

@inject ApiDenunciasClient ApiDenuncias

<h3>Buscador de expedientes por tercero</h3>

<div class="card mt-3">
    <div class="card-body">
        <!-- NIF -->
        <div class="row g-2">
            <div class="col-md-4">
                <label class="form-label">DNI / NIF</label>
                <input class="form-control"
                       placeholder="Ej.: 12345678Z"
                       @bind="nifBuscado"
                       @bind:event="oninput" />
            </div>
        </div>

        <hr />

        <!-- Modo de fechas -->
        <div class="row g-2">
            <div class="col-12">
                <label class="form-label d-block">Rango de fechas</label>

                <div class="form-check form-check-inline">
                    <input class="form-check-input"
                           type="radio"
                           id="modoTodas"
                           name="modoFecha"
                           checked="@IsModo(ModoTodas)"
                           @onchange="@(() => SetModo(ModoTodas))" />
                    <label class="form-check-label" for="modoTodas">
                        Todas las fechas
                    </label>
                </div>

                <div class="form-check form-check-inline">
                    <input class="form-check-input"
                           type="radio"
                           id="modoRango"
                           name="modoFecha"
                           checked="@IsModo(ModoRango)"
                           @onchange="@(() => SetModo(ModoRango))" />
                    <label class="form-check-label" for="modoRango">
                        Entre fechas
                    </label>
                </div>

                <div class="form-check form-check-inline">
                    <input class="form-check-input"
                           type="radio"
                           id="modoUltimos"
                           name="modoFecha"
                           checked="@IsModo(ModoUltimos)"
                           @onchange="@(() => SetModo(ModoUltimos))" />
                    <label class="form-check-label" for="modoUltimos">
                        Últimos X meses
                    </label>
                </div>
            </div>
        </div>

        <!-- Rango de fechas -->
        @if (modoFecha == ModoRango)
        {
            <div class="row g-2 mt-2">
                <div class="col-md-3">
                    <label class="form-label">Desde</label>
                    <input class="form-control"
                           type="date"
                           @bind="fechaDesde" />
                </div>
                <div class="col-md-3">
                    <label class="form-label">Hasta</label>
                    <input class="form-control"
                           type="date"
                           @bind="fechaHasta" />
                </div>
            </div>
        }
        else if (modoFecha == ModoUltimos)
        {
            <div class="row g-2 mt-2">
                <div class="col-md-3">
                    <label class="form-label">Últimos meses</label>
                    <select class="form-select" @bind="mesesUltimos">
                        <option value="3">3 meses</option>
                        <option value="6">6 meses</option>
                        <option value="9">9 meses</option>
                    </select>
                </div>
            </div>
        }

        <!-- Botón buscar -->
        <div class="row g-2 mt-3">
            <div class="col-md-3">
                <button class="btn btn-primary"
                        @onclick="BuscarAsync"
                        disabled="@isSearching">
                    @if (isSearching)
                    {
                        <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
                        <span class="ms-2">Buscando…</span>
                    }
                    else
                    {
                        <i class="bi bi-search"></i>
                        <span class="ms-1">Buscar</span>
                    }
                </button>
            </div>
        </div>

        @if (!string.IsNullOrWhiteSpace(errorMessage))
        {
            <div class="alert alert-danger mt-3">@errorMessage</div>
        }
    </div>
</div>

@if (haBuscado)
{
    <div class="mt-4">
        <h5>Resultados para <strong>@nifMostrado</strong></h5>

        @if (expedientes == null || !expedientes.Any())
        {
            <div class="alert alert-warning mt-3">
                No se han encontrado expedientes asociados a este tercero con los filtros seleccionados.
            </div>
        }
        else
        {
            <table class="table table-striped table-hover mt-3">
                <thead>
                    <tr>
                        <th>Expediente</th>
                        <th>Título expediente</th>
                        <th>Fecha creación</th>
                        <th>Última actividad Gestiona</th>
                        <th></th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var exp in expedientes)
                    {
                        <tr>
                            <td>@exp.CodigoExpediente</td>
                            <td>@exp.Asunto</td>
                            <td>@(exp.FechaCreacion?.ToLocalTime().ToString("dd/MM/yyyy HH:mm"))</td>
                            <td>@(exp.FechaUltimaModificacion?.ToLocalTime().ToString("dd/MM/yyyy HH:mm") ?? "-")</td>
                            <td class="text-end">
                                <button class="btn btn-sm btn-outline-primary"
                                        @onclick="() => ToggleDetalle(exp)">
                                    @(expedienteSeleccionado == exp ? "Ocultar" : "Consultar expediente Gestiona")
                                </button>
                            </td>
                        </tr>

                        @if (expedienteSeleccionado == exp)
                        {
                            <tr class="table-active">
                                <td colspan="5">
                                    <dl class="row mb-0">
                                        <dt class="col-sm-2">Expediente</dt>
                                        <dd class="col-sm-10">@FormatDetailValue(exp.CodigoExpediente)</dd>

                                        <dt class="col-sm-2">Título expediente</dt>
                                        <dd class="col-sm-10">@FormatDetailValue(exp.Asunto)</dd>

                                        <dt class="col-sm-2">Procedimiento</dt>
                                        <dd class="col-sm-10">@FormatDetailValue(exp.Procedimiento)</dd>

                                        <dt class="col-sm-2">Fecha creación</dt>
                                        <dd class="col-sm-10">
                                            @(exp.FechaCreacion?.ToLocalTime().ToString("dd/MM/yyyy HH:mm") ?? "-")
                                        </dd>

                                        <dt class="col-sm-2">Última actividad en Gestiona</dt>
                                        <dd class="col-sm-10">
                                            @(exp.FechaUltimaModificacion?.ToLocalTime().ToString("dd/MM/yyyy HH:mm") ?? "-")
                                        </dd>

                                        @if (!string.IsNullOrWhiteSpace(exp.UltimaAuditoriaMensaje))
                                        {
                                            <dt class="col-sm-2">Última acción</dt>
                                            <dd class="col-sm-10">@exp.UltimaAuditoriaMensaje</dd>
                                        }

                                    </dl>
                                </td>
                            </tr>
                        }
                    }
                </tbody>
            </table>
        }
    </div>
}

@code {
    // ============================================================
    // ESTADO UI
    // ============================================================

    private string nifBuscado = string.Empty;
    private string nifMostrado = string.Empty;

    private const string ModoTodas = "todas";
    private const string ModoRango = "rango";
    private const string ModoUltimos = "ultimos";

    private string modoFecha = ModoTodas;

    private DateTime? fechaDesde;
    private DateTime? fechaHasta;

    private int mesesUltimos = 3;

    private bool isSearching;
    private bool haBuscado;
    private string errorMessage = string.Empty;

    private List<ExpedienteTerceroDto> expedientes = new();

    // expediente cuyo detalle está abierto
    private ExpedienteTerceroDto? expedienteSeleccionado;

    private bool IsModo(string valor) => string.Equals(modoFecha, valor, StringComparison.Ordinal);
    private void SetModo(string valor) => modoFecha = valor;
    private static string FormatDetailValue(string? value)
        => string.IsNullOrWhiteSpace(value) ? "-" : value;

    private void ToggleDetalle(ExpedienteTerceroDto exp)
    {
        if (expedienteSeleccionado == exp)
            expedienteSeleccionado = null;
        else
            expedienteSeleccionado = exp;
    }

    // ============================================================
    // BÚSQUEDA PRINCIPAL
    // ============================================================

    private async Task BuscarAsync()
    {
        errorMessage = string.Empty;
        haBuscado = false;
        expedienteSeleccionado = null;
        expedientes.Clear();

        var nif = (nifBuscado ?? string.Empty).Trim().ToUpperInvariant();
        if (string.IsNullOrWhiteSpace(nif))
        {
            errorMessage = "Introduce un NIF para buscar.";
            return;
        }

        DateTimeOffset? desde = null;
        DateTimeOffset? hasta = null;

        // Calcular rango según el modo
        if (modoFecha == ModoRango)
        {
            if (!fechaDesde.HasValue || !fechaHasta.HasValue)
            {
                errorMessage = "Debes indicar las dos fechas (Desde y Hasta).";
                return;
            }

            desde = new DateTimeOffset(fechaDesde.Value.Date, TimeSpan.Zero);
            hasta = new DateTimeOffset(fechaHasta.Value.Date.AddDays(1).AddTicks(-1), TimeSpan.Zero);

            if (desde > hasta)
            {
                errorMessage = "La fecha 'Desde' no puede ser mayor que 'Hasta'.";
                return;
            }
        }
        else if (modoFecha == ModoUltimos)
        {
            if (mesesUltimos <= 0)
            {
                errorMessage = "El número de meses debe ser mayor que 0.";
                return;
            }

            var ahora = DateTimeOffset.UtcNow;
            desde = ahora.AddMonths(-mesesUltimos);
            hasta = ahora;
        }

        try
        {
            isSearching = true;

            expedientes = await ApiDenuncias.GetGestionaExpedientesPorTerceroAsync(nif, desde, hasta);

            nifMostrado = nif;
            haBuscado = true;
        }
        catch (Exception ex)
        {
            errorMessage = $"Error al buscar expedientes: {ex.Message}";
        }
        finally
        {
            isSearching = false;
            StateHasChanged();
        }
    }

}

