using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Domains.Medias;
using Lada.Framework.Data.Enums;

namespace Lada.Framework.Data.Domains.Finance.Wallets
{
    public class Transaction : BaseEntityWithKey<Guid>
    {
        /// <summary>
        /// Mô tả giao dịch
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// Ghi chú cho giao dịch
        /// </summary>
        public string Note { get; set; }

        /// <summary>
        /// Số tiền giao dịch
        /// </summary>
        public decimal Amount { get; set; }

        /// <summary>
        /// Số tiền mặt
        /// </summary>
        public decimal CashAmount { get; set; }

        /// <summary>
        /// Số tiền chuyển khoản
        /// </summary>
        public decimal TransferAmount { get; set; }

        /// <summary>
        /// Nếu là giao dịch thu tiền từ lái xe, sẽ cần biết thu từ lái xe nào
        /// </summary>
        public int FromUserId { get; set; }

        /// <summary>
        /// Loại giao dịch
        /// </summary>
        public TransactionType TransactionType { get; set; } // "Freight", "COD", "FuelCost", "Salary", "Transfer"...

        /// <summary>   
        /// Hướng giao dịch
        /// </summary>
        public TransactionDirection TransactionDirection { get; set; }

        /// <summary>
        /// Ngày giao dịch
        /// </summary>
        public DateTimeOffset TransactionDate { get; set; }

        /// <summary>
        /// Ví đích (ví nhận tiền khi chuyển, nullable)
        /// </summary>
        public int? RelatedWalletId { get; set; } // Ví đích (ví nhận tiền khi chuyển, nullable)

        /// <summary>
        /// Ví nguồn (ví khởi tạo giao dịch)
        /// </summary>
        public int WalletId { get; set; }       // Ví nguồn (ví khởi tạo giao dịch)

        /// <summary>
        /// Ví nguồn
        /// </summary>
        public virtual Wallet Wallet { get; set; }         // Ví nguồn

        /// <summary>
        /// Ví đích
        /// </summary>
        public virtual Wallet RelatedWallet { get; set; }  // Ví đích

        /// <summary>
        /// ID của chi phí liên kết (nếu có)
        /// </summary>
        public Guid? ExpenseId { get; set; }
        public virtual Expense? Expense { get; set; }

        /// <summary>
        /// ID của doanh thu liên kết (nếu có)
        /// </summary>
        public Guid? IncomeId { get; set; }
        public virtual Income? Income { get; set; }

        /// <summary>
        /// ID nhóm giao dịch chuyển tiền - dùng để link 2 dòng Transaction (gửi/nhận) trong cùng 1 lần chuyển tiền
        /// </summary>
        public Guid? TransferGroupId { get; set; }

        /// <summary>
        /// ID của Media chứa ảnh chứng từ giao dịch (nếu có)
        /// </summary>
        public Guid? MediaId { get; set; }

        /// <summary>
        /// Media chứa ảnh chứng từ giao dịch
        /// </summary>
        public virtual Media? Media { get; set; }

        public ICollection<TransactionOrder> TransactionOrders { get; set; } = new List<TransactionOrder>();
    }
}
