using CMSMicroservice.Domain.Common;
using CMSMicroservice.Domain.Enums;

namespace CMSMicroservice.Domain.Entities;

/// <summary>
/// پیام عمومی برای نمایش در سیستم
/// </summary>
public class PublicMessage : BaseAuditableEntity
{
    /// <summary>
    /// عنوان پیام (حداکثر 200 کاراکتر)
    /// </summary>
    public string Title { get; set; } = string.Empty;

    /// <summary>
    /// محتوای پیام (حداکثر 2000 کاراکتر)
    /// </summary>
    public string Content { get; set; } = string.Empty;

    /// <summary>
    /// نوع پیام (Announcement, News, Warning, Promotion, SystemUpdate, Event)
    /// </summary>
    public MessageType Type { get; set; } = MessageType.Announcement;

    /// <summary>
    /// اولویت پیام (Low, Medium, High, Urgent)
    /// </summary>
    public MessagePriority Priority { get; set; } = MessagePriority.Medium;

    /// <summary>
    /// وضعیت فعال/غیرفعال
    /// </summary>
    public bool IsActive { get; set; } = false;

    /// <summary>
    /// آیا آرشیو شده است؟
    /// </summary>
    public bool IsArchived { get; set; } = false;

    /// <summary>
    /// تاریخ شروع نمایش پیام
    /// </summary>
    public DateTime? StartDate { get; set; }

    /// <summary>
    /// تاریخ پایان نمایش پیام
    /// </summary>
    public DateTime? EndDate { get; set; }

    /// <summary>
    /// تاریخ انتشار
    /// </summary>
    public DateTime? PublishedAt { get; set; }

    /// <summary>
    /// تاریخ آرشیو
    /// </summary>
    public DateTime? ArchivedAt { get; set; }

    /// <summary>
    /// شناسه Admin ایجادکننده
    /// </summary>
    public long? CreatedByUserId { get; set; }

    /// <summary>
    /// تعداد بازدید (اختیاری - برای آمار)
    /// </summary>
    public int ViewCount { get; set; } = 0;

    /// <summary>
    /// لینک اختیاری (برای اطلاعات بیشتر)
    /// </summary>
    public string? LinkUrl { get; set; }

    /// <summary>
    /// متن دکمه لینک (مثلاً "اطلاعات بیشتر")
    /// </summary>
    public string? LinkText { get; set; }

    // Backward compatibility properties (map to StartDate/EndDate)
    public DateTime? StartsAt
    {
        get => StartDate;
        set => StartDate = value;
    }

    public DateTime? ExpiresAt
    {
        get => EndDate;
        set => EndDate = value;
    }
}
