using CMSMicroservice.Domain.Enums;

namespace CMSMicroservice.Domain.Entities.Payment;

/// <summary>
/// پرداخت دستی توسط Admin/SuperAdmin
/// برای موارد خاص: واریز نقدی، تسویه حساب، اصلاح خطا
/// </summary>
public class ManualPayment : BaseAuditableEntity
{
    /// <summary>
    /// شناسه کاربری که پرداخت برای او ثبت می‌شود
    /// </summary>
    public long UserId { get; set; }

    /// <summary>
    /// User Navigation Property
    /// </summary>
    public virtual User User { get; set; } = null!;

    /// <summary>
    /// مبلغ تراکنش (ریال)
    /// </summary>
    public long Amount { get; set; }

    /// <summary>
    /// نوع تراکنش دستی
    /// </summary>
    public ManualPaymentType Type { get; set; }

    /// <summary>
    /// توضیحات (اجباری)
    /// </summary>
    public string Description { get; set; } = string.Empty;

    /// <summary>
    /// شماره مرجع یا شماره فیش (اختیاری)
    /// </summary>
    public string? ReferenceNumber { get; set; }

    /// <summary>
    /// مسیر تصویر فیش واریزی (اختیاری)
    /// </summary>
    public string? ImagePath { get; set; }

    /// <summary>
    /// شناسه سند در FMS (اختیاری)
    /// </summary>
    public long? ImageDocumentId { get; set; }

    /// <summary>
    /// وضعیت تایید
    /// </summary>
    public ManualPaymentStatus Status { get; set; } = ManualPaymentStatus.Pending;

    /// <summary>
    /// شناسه Admin که درخواست را ثبت کرده
    /// </summary>
    public long RequestedBy { get; set; }

    /// <summary>
    /// شناسه SuperAdmin که تایید/رد کرده (nullable)
    /// </summary>
    public long? ApprovedBy { get; set; }

    /// <summary>
    /// تاریخ تایید/رد
    /// </summary>
    public DateTime? ApprovedAt { get; set; }

    /// <summary>
    /// دلیل رد (در صورت رد شدن)
    /// </summary>
    public string? RejectionReason { get; set; }

    /// <summary>
    /// شناسه تراکنش ایجاد شده (بعد از تایید)
    /// </summary>
    public long? TransactionId { get; set; }

    /// <summary>
    /// Transaction Navigation Property
    /// </summary>
    public virtual Transaction? Transaction { get; set; }
}
