namespace CMSMicroservice.Application.Common.Interfaces;

/// <summary>
/// استراتژی محاسبه کمیسیون هفتگی
/// دو پیاده‌سازی دارد: ORM و Stored Procedure
/// </summary>
public interface ICommissionCalculationStrategy
{
    /// <summary>
    /// محاسبه تعادل‌های هفتگی (مرحله 1)
    /// </summary>
    /// <param name="weekDefinitionId">شناسه هفته</param>
    /// <param name="forceRecalculate">محاسبه مجدد حتی اگر قبلاً محاسبه شده</param>
    /// <param name="packageId">اگر مقدار داشته باشد فقط این پکیج محاسبه می‌شود — در غیر این صورت همه پکیج‌ها</param>
    /// <param name="cancellationToken">توکن لغو</param>
    /// <returns>تعداد رکوردهای محاسبه شده</returns>
    Task<int> CalculateWeeklyBalancesAsync(
        long weekDefinitionId, 
        bool forceRecalculate,
        long? packageId = null,
        CancellationToken cancellationToken = default);

    /// <summary>
    /// محاسبه استخر کمیسیون و پرداخت‌ها (مرحله 2)
    /// </summary>
    /// <param name="weekDefinitionId">شناسه هفته</param>
    /// <param name="forceRecalculate">محاسبه مجدد حتی اگر قبلاً محاسبه شده</param>
    /// <param name="packageId">اگر مقدار داشته باشد فقط این پکیج محاسبه می‌شود — در غیر این صورت همه پکیج‌ها</param>
    /// <param name="cancellationToken">توکن لغو</param>
    /// <returns>شناسه Pool ایجاد شده</returns>
    Task<long> CalculateWeeklyCommissionPoolAsync(
        long weekDefinitionId, 
        bool forceRecalculate,
        long? packageId = null,
        CancellationToken cancellationToken = default);
}

/// <summary>
/// نوع استراتژی محاسبه کمیسیون
/// </summary>
public enum CommissionCalculationStrategyType
{
    /// <summary>
    /// استفاده از Entity Framework (ORM) - پیش‌فرض
    /// </summary>
    Orm = 0,
    
    /// <summary>
    /// استفاده از Stored Procedure - بهینه‌تر برای داده‌های زیاد
    /// </summary>
    StoredProcedure = 1
}
