using MiningService.Domain.SeedWork;

namespace MiningService.Domain.AggregatesModel.ConfigurationAggregate;

/// <summary>
/// EN: Referral Configuration - controls referral bonus parameters.
/// VI: Cấu hình Giới thiệu - điều khiển các tham số thưởng giới thiệu.
/// </summary>
public class ReferralConfiguration : Entity, IAggregateRoot
{
    public const string ConfigKey = "referral";

    /// <summary>
    /// EN: Bonus percentage per active referral.
    /// VI: Phần trăm thưởng mỗi giới thiệu hoạt động.
    /// </summary>
    public decimal BonusPercentPerReferral { get; private set; }

    /// <summary>
    /// EN: Maximum total bonus percentage from referrals.
    /// VI: Phần trăm thưởng tối đa từ giới thiệu.
    /// </summary>
    public decimal MaxBonusPercent { get; private set; }

    /// <summary>
    /// EN: Whether KYC is required for referral activation.
    /// VI: Có yêu cầu KYC để kích hoạt giới thiệu không.
    /// </summary>
    public bool KycRequired { get; private set; }

    /// <summary>
    /// EN: Maximum referral levels for multi-level bonus.
    /// VI: Số cấp giới thiệu tối đa cho thưởng đa cấp.
    /// </summary>
    public int MaxReferralLevels { get; private set; }

    public DateTime UpdatedAt { get; private set; }
    public Guid UpdatedBy { get; private set; }

    private ReferralConfiguration() { }

    public static ReferralConfiguration CreateDefault()
    {
        return new ReferralConfiguration
        {
            Id = Guid.NewGuid(),
            BonusPercentPerReferral = 0.25m, // 25% per referral
            MaxBonusPercent = 1.0m, // Max 100% bonus
            KycRequired = true,
            MaxReferralLevels = 1,
            UpdatedAt = DateTime.UtcNow,
            UpdatedBy = Guid.Empty
        };
    }

    public void Update(decimal? bonusPerReferral, decimal? maxBonus, bool? kycRequired, int? maxLevels, Guid updatedBy)
    {
        if (bonusPerReferral.HasValue && bonusPerReferral.Value >= 0)
            BonusPercentPerReferral = bonusPerReferral.Value;
        if (maxBonus.HasValue && maxBonus.Value >= 0)
            MaxBonusPercent = maxBonus.Value;
        if (kycRequired.HasValue)
            KycRequired = kycRequired.Value;
        if (maxLevels.HasValue && maxLevels.Value > 0)
            MaxReferralLevels = maxLevels.Value;

        UpdatedAt = DateTime.UtcNow;
        UpdatedBy = updatedBy;
    }
}
