using adas_core.Application.Exceptions;
using adas_core.Authentication.Attributes;
using adas_core.Domain.Enums;
using audit_logs.Models.DTO;
using audit_logs.Services.Interfaces;
using Microsoft.AspNetCore.Mvc;

namespace adas_core.Controllers;

/// <summary>
///     Controlador API responsable de exponer los endpoints relacionados con la gestión y
///     consulta de registros de auditoría del sistema. Proporciona operaciones para recuperar,
///     filtrar y exportar logs de auditoría a través de peticiones HTTP.
/// </summary>
[Route("audits")]
[ApiController]
public class AuditController(IAuditService auditService) : ControllerBase // Hereda de ControllerBase
{
    /// <summary>
    ///     Recupera registros de auditoria basándose en criterios de búsqueda en cualquier campo de texto y fechas.
    /// </summary>
    /// <param name="auditRequestDto">
    ///     DTO que contiene los parámetros de búsqueda para los registros de auditoria. Incluye:
    ///     - <c>pageNumber</c>: Número de página para la paginación de resultados.
    ///     - <c>pageSize</c>: Cantidad de registros por página.
    ///     - <c>searchText</c>: Texto libre para buscar en todos los campos textuales (RecordId, EntityType, ActionType)de los
    ///     registros de auditoria. Opcional
    ///     - <c>actionTime</c>: Fecha concreta en la que se busca un registro de auditoria, para algún contexto puede ser
    ///     util. Opcional
    ///     - <c>startDate</c>: Fecha de inicio para filtrar los registros por rango de fechas. Opcional
    ///     - <c>endDate</c>: Fecha de fin para el filtro por rango de fechas. Opcional
    /// </param>
    /// <returns>
    ///     Una respuesta de acción que puede ser una lista de registros de auditoria o un mensaje de error.
    ///     Retorna <c>Ok</c> con los registros encontrados o <c>BadRequest</c> si hay un error en los parámetros.
    /// </returns>
    [AuthorizeRoles(PermissionEnum.RolesType.AuthSome)]
    [PermissionAuthorize("Source", "DisplayId")]
    [HttpPost]
    public async Task<IActionResult> GetAuditRecordsByAnyTextField(
        [FromBody] AuditLogTextOrDateSearchDTO auditRequestDto)
    {
        try
        {
            var result = await auditService.GetAuditLogsMatchingTextOrDateAsync(auditRequestDto);
            return Ok(result);
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine(ex.Message);
            throw new CustomArgumentException(HttpEnum.ErrorMessage.BadRequestInvalidFormat);
        }
    }
}