using IamService.Domain.SeedWork;

namespace IamService.Domain.AggregatesModel.VerificationAggregate;

/// <summary>
/// EN: Interface for IdentityVerification repository.
/// VI: Interface cho repository IdentityVerification.
/// </summary>
public interface IIdentityVerificationRepository : IRepository<IdentityVerification>
{
    /// <summary>
    /// EN: Get verification by ID.
    /// VI: Lấy xác thực theo ID.
    /// </summary>
    Task<IdentityVerification?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get all verifications for a user.
    /// VI: Lấy tất cả xác thực của một user.
    /// </summary>
    Task<IEnumerable<IdentityVerification>> GetByUserIdAsync(Guid userId, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get active verification for a user by type.
    /// VI: Lấy xác thực đang hoạt động của user theo loại.
    /// </summary>
    Task<IdentityVerification?> GetActiveByUserIdAndTypeAsync(
        Guid userId,
        VerificationType type,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get latest verification for a user by type.
    /// VI: Lấy xác thực mới nhất của user theo loại.
    /// </summary>
    Task<IdentityVerification?> GetLatestByUserIdAndTypeAsync(
        Guid userId,
        VerificationType type,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Check if user has verified a specific type.
    /// VI: Kiểm tra user đã xác thực loại cụ thể chưa.
    /// </summary>
    Task<bool> HasVerifiedAsync(Guid userId, VerificationType type, CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Get pending verifications that have expired.
    /// VI: Lấy các xác thực đang chờ đã hết hạn.
    /// </summary>
    Task<IEnumerable<IdentityVerification>> GetExpiredPendingAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// EN: Add a new verification.
    /// VI: Thêm xác thực mới.
    /// </summary>
    IdentityVerification Add(IdentityVerification verification);

    /// <summary>
    /// EN: Update an existing verification.
    /// VI: Cập nhật xác thực hiện có.
    /// </summary>
    void Update(IdentityVerification verification);
}
