namespace MissionService.Domain.AggregatesModel.RewardAggregate;

using MissionService.Domain.SeedWork;

/// <summary>
/// EN: Repository interface for UserReward aggregate
/// VI: Interface repository cho UserReward aggregate
/// </summary>
public interface IUserRewardRepository : IRepository<UserReward>
{
    /// <summary>
    /// EN: Add a new reward / VI: Thêm phần thưởng mới
    /// </summary>
    UserReward Add(UserReward reward);
    
    /// <summary>
    /// EN: Update reward / VI: Cập nhật phần thưởng
    /// </summary>
    void Update(UserReward reward);
    
    /// <summary>
    /// EN: Get reward by ID / VI: Lấy phần thưởng theo ID
    /// </summary>
    Task<UserReward?> GetByIdAsync(Guid id, CancellationToken ct = default);
    
    /// <summary>
    /// EN: Get rewards by user ID / VI: Lấy phần thưởng theo user ID
    /// </summary>
    Task<IReadOnlyList<UserReward>> GetByUserIdAsync(Guid userId, CancellationToken ct = default);
    
    /// <summary>
    /// EN: Get pending rewards by user / VI: Lấy phần thưởng đang chờ của user
    /// </summary>
    Task<IReadOnlyList<UserReward>> GetPendingByUserIdAsync(Guid userId, CancellationToken ct = default);
    
    /// <summary>
    /// EN: Get reward by source ID / VI: Lấy phần thưởng theo source ID
    /// </summary>
    Task<UserReward?> GetBySourceIdAsync(Guid sourceId, CancellationToken ct = default);
    
    /// <summary>
    /// EN: Sum claimed points for user in period / VI: Tổng điểm đã nhận của user trong khoảng thời gian
    /// </summary>
    Task<decimal> SumClaimedPointsAsync(
        Guid userId,
        DateTime fromDate,
        DateTime toDate,
        CancellationToken ct = default);
    
    /// <summary>
    /// EN: Get expired unclaimed rewards / VI: Lấy các phần thưởng hết hạn chưa nhận
    /// </summary>
    Task<IReadOnlyList<UserReward>> GetExpiredUnclaimedAsync(CancellationToken ct = default);
}
