namespace MissionService.Domain.AggregatesModel.RewardAggregate;

using MissionService.Domain.SeedWork;

/// <summary>
/// EN: Reward amount value object / VI: Value object số lượng phần thưởng
/// </summary>
public class RewardAmount : ValueObject
{
    /// <summary>EN: Base points / VI: Điểm cơ bản</summary>
    public decimal Points { get; private set; }
    
    /// <summary>EN: Bonus points / VI: Điểm thưởng thêm</summary>
    public decimal BonusPoints { get; private set; }
    
    /// <summary>EN: Currency type / VI: Loại tiền tệ</summary>
    public string Currency { get; private set; } = "MP"; // Mining Points
    
    /// <summary>EN: Total points / VI: Tổng điểm</summary>
    public decimal TotalPoints => Points + BonusPoints;
    
    // EF Core constructor
    protected RewardAmount() { }
    
    private RewardAmount(decimal points, decimal bonusPoints, string currency)
    {
        Points = points;
        BonusPoints = bonusPoints;
        Currency = currency;
    }
    
    /// <summary>
    /// EN: Create reward amount with points only / VI: Tạo số lượng thưởng chỉ có điểm
    /// </summary>
    public static RewardAmount Create(decimal points, decimal bonusPoints = 0, string currency = "MP")
    {
        if (points < 0)
            throw new ArgumentException("Points cannot be negative", nameof(points));
        if (bonusPoints < 0)
            throw new ArgumentException("Bonus points cannot be negative", nameof(bonusPoints));
            
        return new RewardAmount(points, bonusPoints, currency);
    }
    
    /// <summary>
    /// EN: Add bonus to existing amount / VI: Thêm bonus vào số lượng hiện tại
    /// </summary>
    public RewardAmount WithBonus(decimal additionalBonus)
    {
        return new RewardAmount(Points, BonusPoints + additionalBonus, Currency);
    }
    
    protected override IEnumerable<object?> GetEqualityComponents()
    {
        yield return Points;
        yield return BonusPoints;
        yield return Currency;
    }
}
