using Lada.Framework.Data.Enums;
using Lada.Framework.DTO;
using System.ComponentModel.DataAnnotations;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Finances
{
    /// <summary>
    /// Model cho giao dịch ngân hàng
    /// </summary>
    public class BankTransactionModel : BaseModel<Guid>
    {
        /// <summary>
        /// ID tài khoản ngân hàng
        /// </summary>
        [Required(ErrorMessage = "ID tài khoản ngân hàng không được để trống")]
        public int BankAccountId { get; set; }

        /// <summary>
        /// Mã giao dịch từ ngân hàng
        /// </summary>
        [Required(ErrorMessage = "Mã giao dịch không được để trống")]
        [MaxLength(128, ErrorMessage = "Mã giao dịch không được vượt quá 128 ký tự")]
        public string TransactionCode { get; set; } = string.Empty;

        /// <summary>
        /// Ngày giao dịch
        /// </summary>
        [Required(ErrorMessage = "Ngày giao dịch không được để trống")]
        public DateTimeOffset TransactionDate { get; set; }

        /// <summary>
        /// Số tiền ghi có (tiền vào)
        /// </summary>
        [Range(0, double.MaxValue, ErrorMessage = "Số tiền ghi có phải lớn hơn hoặc bằng 0")]
        public decimal CreditAmount { get; set; }

        /// <summary>
        /// Số tiền ghi nợ (tiền ra)
        /// </summary>
        [Range(0, double.MaxValue, ErrorMessage = "Số tiền ghi nợ phải lớn hơn hoặc bằng 0")]
        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>
        [Required(ErrorMessage = "Nội dung giao dịch không được để trống")]
        [MaxLength(2048, ErrorMessage = "Nội dung giao dịch không được vượt quá 2048 ký tự")]
        public string Description { get; set; } = string.Empty;

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

        /// <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
        /// </summary>
        [MaxLength(128, ErrorMessage = "Mã tham chiếu không được vượt quá 128 ký tự")]
        public string ReferenceNumber { get; set; } = string.Empty;

        /// <summary>
        /// Tên người gửi/nhận
        /// </summary>
        [MaxLength(512, ErrorMessage = "Tên người gửi/nhận không được vượt quá 512 ký tự")]
        public string CounterpartyName { get; set; } = string.Empty;

        /// <summary>
        /// Số tài khoản người gửi/nhận
        /// </summary>
        [MaxLength(50, ErrorMessage = "Số tài khoản người gửi/nhận không được vượt quá 50 ký tự")]
        public string CounterpartyAccount { get; set; } = string.Empty;

        /// <summary>
        /// Ngân hàng của người gửi/nhận
        /// </summary>
        [MaxLength(256, ErrorMessage = "Ngân hàng của người gửi/nhận không được vượt quá 256 ký tự")]
        public string CounterpartyBank { get; set; } = string.Empty;

        /// <summary>
        /// Ghi chú xử lý
        /// </summary>
        [MaxLength(1024, ErrorMessage = "Ghi chú xử lý không được vượt quá 1024 ký tự")]
        public string ProcessNote { get; set; } = string.Empty;
    }

    /// <summary>
    /// Model tìm kiếm giao dịch ngân hàng
    /// </summary>
    public class BankTransactionSearchModel
    {
        /// <summary>
        /// Từ khóa tìm kiếm
        /// </summary>
        public string? Keyword { get; set; }

        /// <summary>
        /// ID tài khoản ngân hàng
        /// </summary>
        public int? BankAccountId { get; set; }

        /// <summary>
        /// Mã giao dịch
        /// </summary>
        public string? TransactionCode { get; set; }

        /// <summary>
        /// Ngày giao dịch từ
        /// </summary>
        public DateTimeOffset? TransactionDateFrom { get; set; }

        /// <summary>
        /// Ngày giao dịch đến
        /// </summary>
        public DateTimeOffset? TransactionDateTo { get; set; }

        /// <summary>
        /// Số tiền từ
        /// </summary>
        public decimal? AmountFrom { get; set; }

        /// <summary>
        /// Số tiền đến
        /// </summary>
        public decimal? AmountTo { get; set; }

        /// <summary>
        /// Loại giao dịch (Credit/Debit)
        /// </summary>
        public string? TransactionDirection { get; set; } // "Credit" hoặc "Debit"

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

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

        /// <summary>
        /// ID import
        /// </summary>
        public Guid? ImportId { get; set; }
    }
}
