using AdsManagerService.Domain.SeedWork;

namespace AdsManagerService.Domain.AggregatesModel.CampaignAggregate;

/// <summary>
/// EN: Campaign budget value object representing daily or lifetime budget.
/// VI: Value object ngân sách chiến dịch đại diện cho ngân sách ngày hoặc tổng.
/// </summary>
public class CampaignBudget : ValueObject
{
    /// <summary>
    /// EN: Budget type (Daily or Lifetime).
    /// VI: Loại ngân sách (Hàng ngày hoặc Tổng).
    /// </summary>
    public BudgetType Type { get; private set; }

    /// <summary>
    /// EN: Budget amount in the account's currency.
    /// VI: Số tiền ngân sách theo đơn vị tiền tệ của tài khoản.
    /// </summary>
    public decimal Amount { get; private set; }

    /// <summary>
    /// EN: Currency code (e.g., VND, USD).
    /// VI: Mã tiền tệ (ví dụ: VND, USD).
    /// </summary>
    public string Currency { get; private set; } = "VND";

    protected CampaignBudget() { }

    public CampaignBudget(BudgetType type, decimal amount, string currency = "VND")
    {
        if (amount <= 0)
            throw new ArgumentException("Budget amount must be greater than zero", nameof(amount));

        Type = type;
        Amount = amount;
        Currency = currency;
    }

    /// <summary>
    /// EN: Create a daily budget.
    /// VI: Tạo ngân sách hàng ngày.
    /// </summary>
    public static CampaignBudget Daily(decimal amount, string currency = "VND") =>
        new(BudgetType.Daily, amount, currency);

    /// <summary>
    /// EN: Create a lifetime budget.
    /// VI: Tạo ngân sách tổng.
    /// </summary>
    public static CampaignBudget Lifetime(decimal amount, string currency = "VND") =>
        new(BudgetType.Lifetime, amount, currency);

    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return Type;
        yield return Amount;
        yield return Currency;
    }
}

/// <summary>
/// EN: Budget type enumeration.
/// VI: Enum loại ngân sách.
/// </summary>
public enum BudgetType
{
    /// <summary>
    /// EN: Daily budget - resets each day.
    /// VI: Ngân sách ngày - reset mỗi ngày.
    /// </summary>
    Daily = 1,

    /// <summary>
    /// EN: Lifetime budget - total for campaign duration.
    /// VI: Ngân sách tổng - tổng cho toàn bộ thời gian chiến dịch.
    /// </summary>
    Lifetime = 2
}
