using CMSMicroservice.Domain.Entities.Commission;
using CMSMicroservice.Domain.Entities.History;
using CMSMicroservice.Domain.Entities.Network;

namespace CMSMicroservice.Domain.Entities;

/// <summary>
/// تعریف هفته‌ها برای نمایش در سیستم
/// این جدول شامل اطلاعات کامل هر هفته شامل شماره نمایشی، شماره میلادی، شماره شمسی و بازه تاریخی است
/// </summary>
public class WeekDefinition : BaseAuditableEntity
{
    /// <summary>
    /// شماره ترتیبی هفته (1، 2، 3، ...)
    /// برای مرتب‌سازی و محاسبات استفاده می‌شود
    /// </summary>
    public int WeekOrder { get; set; }
    
    /// <summary>
    /// نام نمایشی هفته (مثال: "هفته یکم"، "هفته دوم"، "هفته سوم")
    /// این متن برای نمایش به کاربر نهایی (ادمین و مشتری) استفاده می‌شود
    /// </summary>
    public string DisplayName { get; set; } = string.Empty;

    /// <summary>
    /// شماره هفته میلادی (مثال: "2025-W01", "2025-W02")
    /// فرمت ISO 8601
    /// </summary>
    public string GregorianWeekNumber { get; set; } = string.Empty;

    /// <summary>
    /// شماره هفته شمسی (مثال: "1403-W01", "1403-W02")
    /// </summary>
    public string PersianWeekNumber { get; set; } = string.Empty;

    /// <summary>
    /// تاریخ شروع هفته (میلادی) - شنبه
    /// </summary>
    public DateTime StartDate { get; set; }

    /// <summary>
    /// تاریخ پایان هفته (میلادی) - جمعه
    /// </summary>
    public DateTime EndDate { get; set; }

    /// <summary>
    /// سال میلادی
    /// </summary>
    public int GregorianYear { get; set; }

    /// <summary>
    /// سال شمسی
    /// </summary>
    public int PersianYear { get; set; }

    /// <summary>
    /// آیا این هفته فعال است؟
    /// </summary>
    public bool IsActive { get; set; } = true;

    // Navigation Properties
    public virtual ICollection<NetworkWeeklyBalance>? NetworkWeeklyBalances { get; set; }
    public virtual ICollection<WeeklyCommissionPool>? WeeklyCommissionPools { get; set; }
    public virtual ICollection<UserCommissionPayout>? UserCommissionPayouts { get; set; }
    public virtual ICollection<WorkerExecutionLog>? WorkerExecutionLogs { get; set; }
    public virtual ICollection<CommissionPayoutHistory>? CommissionPayoutHistories { get; set; }
}
