using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Itentity;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Identity;

namespace Ladaer.BackEnd.Infrastructures.Services.Identity
{
    /// <summary>
    /// Service interface for managing Permission Groups and Role assignments
    /// </summary>
    public interface IPermissionService
    {
        /// <summary>
        /// Tạo Permission Group mới
        /// </summary>
        /// <param name="name">Tên Permission Group</param>
        /// <param name="description">Mô tả</param>
        /// <param name="roleIds">Danh sách Role ID</param>
        /// <returns>Permission đã tạo</returns>
        Task<Permission> CreatePermissionAsync(string name, string? description, List<int> roleIds);

        /// <summary>
        /// Cập nhật Permission Group
        /// </summary>
        /// <param name="permissionId">ID của Permission</param>
        /// <param name="name">Tên mới</param>
        /// <param name="description">Mô tả mới</param>
        /// <param name="roleIds">Danh sách Role ID mới</param>
        /// <returns>Permission đã cập nhật</returns>
        Task<Permission?> UpdatePermissionAsync(int permissionId, string name, string? description, List<int> roleIds);

        /// <summary>
        /// Xóa Permission Group
        /// </summary>
        /// <param name="permissionId">ID của Permission</param>
        /// <returns>True nếu xóa thành công</returns>
        Task<bool> DeletePermissionAsync(int permissionId);

        /// <summary>
        /// Gán Permission cho User và tự động cập nhật UserRole
        /// </summary>
        /// <param name="userId">ID của User</param>
        /// <param name="permissionId">ID của Permission</param>
        /// <returns>True nếu gán thành công</returns>
        Task<BaseResult> AssignPermissionToUserAsync(int userId, int permissionId);

        /// <summary>
        /// Xóa Permission khỏi User và xóa tất cả UserRole
        /// </summary>
        /// <param name="userId">ID của User</param>
        /// <returns>True nếu xóa thành công</returns>
        Task<bool> RemovePermissionFromUserAsync(int userId);

        /// <summary>
        /// Lấy danh sách Permission
        /// </summary>
        /// <returns>Danh sách Permission</returns>
        Task<List<Permission>> GetAllPermissionsAsync();

        /// <summary>
        /// Lấy Permission theo ID
        /// </summary>
        /// <param name="permissionId">ID của Permission</param>
        /// <returns>Permission hoặc null</returns>
        Task<Permission?> GetPermissionByIdAsync(int permissionId);

        /// <summary>
        /// Lấy danh sách Role trong Permission
        /// </summary>
        /// <param name="permissionId">ID của Permission</param>
        /// <returns>Danh sách Role</returns>
        Task<List<Role>> GetRolesInPermissionAsync(int permissionId);

        /// <summary>
        /// Kiểm tra User có quyền truy cập Role không
        /// </summary>
        /// <param name="userId">ID của User</param>
        /// <param name="roleName">Tên Role cần kiểm tra</param>
        /// <returns>True nếu có quyền</returns>
        Task<bool> UserHasRoleAsync(int userId, string roleName);

        /// <summary>
        /// Tìm kiếm Permission với phân trang
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Kết quả tìm kiếm có phân trang</returns>
        Task<SmartTableResult<Permission>> SearchAsync(SmartTableParam param);

        /// <summary>
        /// Lấy tất cả Roles có thể gán cho Permission
        /// </summary>
        /// <returns>Danh sách tất cả Roles</returns>
        Task<List<Role>> GetAllAvailableRolesAsync();

        /// <summary>
        /// Tạo hoặc cập nhật Permission (theo pattern AgencyController)
        /// </summary>
        /// <param name="model">PermissionModel</param>
        /// <returns>PermissionResult</returns>
        Task<PermissionResult> CreateOrUpdate(PermissionModel model);

        /// <summary>
        /// Lấy Permission theo ID và chuyển về PermissionModel
        /// </summary>
        /// <param name="id">ID của Permission</param>
        /// <returns>PermissionModel</returns>
        Task<PermissionModel> GetById(int id);

        /// <summary>
        /// Cập nhật danh sách Role của Permission (hàm riêng biệt)
        /// </summary>
        /// <param name="permissionId">ID của Permission</param>
        /// <param name="roleIds">Danh sách Role ID mới</param>
        /// <returns>PermissionResult</returns>
        Task<PermissionResult> UpdatePermissionRoles(PermissionRoleModel model);
    }
}
