using MediatR;

namespace IamService.API.Application.Queries.AccessRequests;

/// <summary>
/// EN: Query to get access request by ID.
/// VI: Query để lấy yêu cầu truy cập theo ID.
/// </summary>
public record GetAccessRequestByIdQuery(Guid Id) : IRequest<AccessRequestDto?>;

/// <summary>
/// EN: Query to get my access requests.
/// VI: Query để lấy yêu cầu truy cập của tôi.
/// </summary>
public record GetMyAccessRequestsQuery(Guid RequesterId) : IRequest<IEnumerable<AccessRequestDto>>;

/// <summary>
/// EN: Query to get pending approvals for current user.
/// VI: Query để lấy các yêu cầu đang chờ phê duyệt của user hiện tại.
/// </summary>
public record GetPendingApprovalsQuery(Guid ApproverId) : IRequest<IEnumerable<AccessRequestDto>>;

/// <summary>
/// EN: Access request DTO.
/// VI: DTO cho yêu cầu truy cập.
/// </summary>
public record AccessRequestDto(
    Guid Id,
    Guid RequesterId,
    string ResourceType,
    Guid ResourceId,
    string RequestedPermission,
    string? Justification,
    string Status,
    string Priority,
    DateTime CreatedAt,
    DateTime? SubmittedAt,
    DateTime? ResolvedAt,
    DateTime? ExpiresAt,
    IEnumerable<AccessRequestApproverDto> Approvers);

/// <summary>
/// EN: Access request approver DTO.
/// VI: DTO cho người phê duyệt yêu cầu truy cập.
/// </summary>
public record AccessRequestApproverDto(
    Guid Id,
    Guid UserId,
    int Order,
    string Status,
    DateTime? RespondedAt,
    string? Comments);
