using Lada.Framework.Data.Domains.Finance;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finances;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Finances
{
    /// <summary>
    /// Model chi tiết đối soát
    /// </summary>
    public class ReconciliationDetailModel
    {
        /// <summary>
        /// ID đối soát
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Mã đối soát
        /// </summary>
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// Thông tin khách hàng
        /// </summary>
        public CustomerItem? Customer { get; set; }

        /// <summary>
        /// Từ ngày
        /// </summary>
        public DateTimeOffset FromDate { get; set; }

        /// <summary>
        /// Đến ngày
        /// </summary>
        public DateTimeOffset ToDate { get; set; }

        /// <summary>
        /// Ngày chuyển tiền
        /// </summary>
        public DateTimeOffset? TransferDate { get; set; }

        /// <summary>
        /// Tổng tiền COD
        /// </summary>
        public decimal TotalCodAmount { get; set; }

        /// <summary>
        /// Tổng phí trừ
        /// </summary>
        public decimal TotalFeeAmount { get; set; }

        /// <summary>
        /// Số tiền thực chuyển
        /// </summary>
        public decimal NetAmount { get; set; }

        /// <summary>
        /// Số lượng đơn hàng
        /// </summary>
        public int OrderCount { get; set; }

        /// <summary>
        /// Trạng thái
        /// </summary>
        public ReconciliationStatus Status { get; set; }

        /// <summary>
        /// Trạng thái dạng string
        /// </summary>
        public string StatusStr { get; set; } = string.Empty;

        /// <summary>
        /// Loại phiếu đối soát
        /// </summary>
        public ReconciliationType Type { get; set; }

        /// <summary>
        /// Loại phiếu đối soát dạng string
        /// </summary>
        public string TypeStr { get; set; } = string.Empty;

        /// <summary>
        /// ID thông tin xuất hóa đơn VAT
        /// </summary>
        public int? VatInfoId { get; set; }

        /// <summary>
        /// Thông tin xuất hóa đơn VAT
        /// </summary>
        public VatInfoItem? VatInfo { get; set; }

        /// <summary>
        /// Thông tin tài khoản ngân hàng
        /// </summary>
        public BankAccountInfo? BankAccount { get; set; }

        /// <summary>
        /// Người tạo
        /// </summary>
        public string CreatedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Ngày tạo
        /// </summary>
        public DateTimeOffset CreatedTime { get; set; }

        /// <summary>
        /// Người phê duyệt
        /// </summary>
        public string ApprovedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Người chuyển tiền
        /// </summary>
        public string TransferredByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Ghi chú
        /// </summary>
        public string Note { get; set; } = string.Empty;

        /// <summary>
        /// Thông tin chuyển khoản
        /// </summary>
        public string TransferInfo { get; set; } = string.Empty;

        /// <summary>
        /// Danh sách đơn hàng trong đối soát
        /// </summary>
        public List<ReconciliationOrderItem> Orders { get; set; } = new List<ReconciliationOrderItem>();

        /// <summary>
        /// Có thể chỉnh sửa không
        /// </summary>
        public bool CanEdit => Status == ReconciliationStatus.Draft;

        /// <summary>
        /// Có thể xác nhận không
        /// </summary>
        public bool CanConfirm { get; set; }

        /// <summary>
        /// Có thể chuyển tiền không
        /// </summary>
        public bool CanTransfer { get; set; }

        /// <summary>
        /// Có thể hủy không
        /// </summary>
        public bool CanCancel => Status == ReconciliationStatus.Draft || Status == ReconciliationStatus.Confirmed;
    }

    /// <summary>
    /// Thông tin tài khoản ngân hàng trong đối soát
    /// </summary>
    public class BankAccountInfo
    {
        /// <summary>
        /// Số tài khoản
        /// </summary>
        public string AccountNumber { get; set; } = string.Empty;

        /// <summary>
        /// Tên chủ tài khoản
        /// </summary>
        public string AccountHolderName { get; set; } = string.Empty;

        /// <summary>
        /// Mã ngân hàng
        /// </summary>
        public string BankCode { get; set; } = string.Empty;

        /// <summary>
        /// Tên ngân hàng
        /// </summary>
        public string BankName { get; set; } = string.Empty;

        /// <summary>
        /// Tên chi nhánh
        /// </summary>
        public string BranchName { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ chi nhánh
        /// </summary>
        public string BranchAddress { get; set; } = string.Empty;

        /// <summary>
        /// Thông tin hiển thị đầy đủ
        /// </summary>
        public string DisplayInfo => $"{AccountHolderName} - {AccountNumber} ({BankName})";
    }
}
