using GestionIntegral.Api.Models.Usuarios;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Data; // Para IDbTransaction

namespace GestionIntegral.Api.Data.Repositories.Usuarios
{
    public interface IPerfilRepository
    {
        Task<IEnumerable<Perfil>> GetAllAsync(string? nombreFilter);
        Task<Perfil?> GetByIdAsync(int id);
        Task<Perfil?> CreateAsync(Perfil nuevoPerfil, int idUsuario, IDbTransaction transaction);
        Task<bool> UpdateAsync(Perfil perfilAActualizar, int idUsuario, IDbTransaction transaction);
        Task<bool> DeleteAsync(int id, int idUsuario, IDbTransaction transaction);
        Task<bool> ExistsByNameAsync(string nombrePerfil, int? excludeId = null);
        Task<bool> IsInUseAsync(int id);
        Task<IEnumerable<int>> GetPermisoIdsByPerfilIdAsync(int idPerfil);
        Task UpdatePermisosByPerfilIdAsync(int idPerfil, IEnumerable<int> nuevosPermisosIds, IDbTransaction transaction);
        Task LogPermisoAsignacionHistorialAsync(int idPerfil, int idPermiso, int idUsuario, string tipoMod, IDbTransaction transaction);
        Task<IEnumerable<(PerfilHistorico Historial, string NombreUsuarioModifico)>> GetHistorialAsync(
        DateTime? fechaDesde, DateTime? fechaHasta,
        int? idUsuarioModifico, string? tipoModificacion,
        int? idPerfilOriginal);
        Task<IEnumerable<(PermisosPerfilesHistorico Historial, string NombreUsuarioModifico, string NombrePerfil, string DescPermiso, string CodAccPermiso)>> GetPermisosAsignadosHistorialAsync(
        DateTime? fechaDesde, DateTime? fechaHasta,
        int? idUsuarioModifico, string? tipoModificacion,
        int? idPerfilAfectado, int? idPermisoAfectado);
    }
}