using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Enums;
using System.ComponentModel.DataAnnotations;

namespace Lada.Framework.Data.Domains.Finance
{
    /// <summary>
    /// Giao dịch ngân hàng
    /// </summary>
    public class BankTransaction : BaseEntityWithKey<Guid>
    {
        /// <summary>
        /// ID tài khoản ngân hàng
        /// </summary>
        public int BankAccountId { get; set; }

        /// <summary>
        /// Mã giao dịch từ ngân hàng
        /// </summary>
        [MaxLength(512)]
        public string TransactionCode { get; set; } = string.Empty;

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

        /// <summary>
        /// Số tiền ghi có (tiền vào)
        /// </summary>
        public decimal CreditAmount { get; set; }

        /// <summary>
        /// Số tiền ghi nợ (tiền ra)
        /// </summary>
        public decimal DebitAmount { get; set; }

        /// <summary>
        /// Số dư sau giao dịch
        /// </summary>
        public decimal Balance { get; set; }

        /// <summary>
        /// Nội dung giao dịch
        /// </summary>
        [MaxLength(2048)]
        public string Description { get; set; } = string.Empty;

        /// <summary>
        /// Thời gian giao dịch chi tiết (nếu có)
        /// </summary>
        public DateTimeOffset? DetailedTime { get; set; }

        /// <summary>
        /// Dữ liệu thô từ file Excel
        /// </summary>
        [MaxLength(4000)]
        public string RawData { get; set; } = string.Empty;

        /// <summary>
        /// Trạng thái xử lý
        /// </summary>
        public TransactionProcessStatus ProcessStatus { get; set; } = TransactionProcessStatus.Pending;

        /// <summary>
        /// Loại giao dịch
        /// </summary>
        public BankTransactionType? TransactionType { get; set; }

        /// <summary>
        /// Mã tham chiếu (reference number)
        /// </summary>
        [MaxLength(128)]
        public string ReferenceNumber { get; set; } = string.Empty;

        /// <summary>
        /// Tên người gửi/nhận
        /// </summary>
        [MaxLength(512)]
        public string CounterpartyName { get; set; } = string.Empty;

        /// <summary>
        /// Số tài khoản người gửi/nhận
        /// </summary>
        [MaxLength(50)]
        public string CounterpartyAccount { get; set; } = string.Empty;

        /// <summary>
        /// Ngân hàng của người gửi/nhận
        /// </summary>
        [MaxLength(256)]
        public string CounterpartyBank { get; set; } = string.Empty;

        /// <summary>
        /// ID import (nếu được import từ file)
        /// </summary>
        public Guid? ImportId { get; set; }

        /// <summary>
        /// Số dòng trong file import
        /// </summary>
        public int? ImportRowNumber { get; set; }

        /// <summary>
        /// Thứ tự hiển thị
        /// </summary>
        public int DisplayOrder { get; set; }

        /// <summary>
        /// Ghi chú xử lý
        /// </summary>
        [MaxLength(1024)]
        public string ProcessNote { get; set; } = string.Empty;

        #region Navigation Properties

        /// <summary>
        /// Tài khoản ngân hàng
        /// </summary>
        public virtual BankAccount BankAccount { get; set; } = null!;

        /// <summary>
        /// Thông tin import (nếu có)
        /// </summary>
        public virtual BankStatementImport? BankStatementImport { get; set; }

        #endregion
    }
}
