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

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Finance
{
    /// <summary>
    /// Model chi tiết hóa đơn thanh toán chuyển khoản
    /// </summary>
    public class TransferPaymentBillDetailModel : BaseModel<int>
    {
        /// <summary>
        /// Mã hóa đơn
        /// </summary>
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// ID khách hàng
        /// </summary>
        public int CustomerId { get; set; }

        /// <summary>
        /// Tên khách hàng
        /// </summary>
        public string CustomerName { get; set; } = string.Empty;

        /// <summary>
        /// Số điện thoại khách hàng
        /// </summary>
        public string CustomerPhone { get; set; } = string.Empty;

        /// <summary>
        /// Email khách hàng
        /// </summary>
        public string CustomerEmail { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ khách hàng
        /// </summary>
        public string CustomerAddress { get; set; } = string.Empty;



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

        /// <summary>
        /// Tổng tiền TransferFee (formatted)
        /// </summary>
        public string TotalAmountFormatted => TotalAmount.FormatCurrency();

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

        /// <summary>
        /// Trạng thái hóa đơn
        /// </summary>
        public TransferPaymentBillStatus Status { get; set; }

        /// <summary>
        /// Tên trạng thái hóa đơn
        /// </summary>
        public string StatusName => Status.GetDescription();

        /// <summary>
        /// Mức độ ưu tiên
        /// </summary>
        public TransferPaymentBillPriority Priority { get; set; }

        /// <summary>
        /// Tên mức độ ưu tiên
        /// </summary>
        public string PriorityName => Priority.GetDescription();

        #region Thông tin ngân hàng công ty

        /// <summary>
        /// Số tài khoản ngân hàng công ty/đại lý
        /// </summary>
        public string CompanyBankAccountNumber { get; set; } = string.Empty;

        /// <summary>
        /// Tên chủ tài khoản công ty/đại lý
        /// </summary>
        public string CompanyBankAccountHolderName { get; set; } = string.Empty;

        /// <summary>
        /// Mã ngân hàng công ty/đại lý
        /// </summary>
        public string CompanyBankCode { get; set; } = string.Empty;

        /// <summary>
        /// Tên ngân hàng công ty/đại lý
        /// </summary>
        public string CompanyBankName { get; set; } = string.Empty;

        /// <summary>
        /// Tên chi nhánh ngân hàng công ty/đại lý
        /// </summary>
        public string CompanyBankBranchName { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ chi nhánh ngân hàng công ty/đại lý
        /// </summary>
        public string CompanyBankBranchAddress { get; set; } = string.Empty;

        #endregion

        /// <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;

        #region Thông tin người duyệt

        /// <summary>
        /// Người duyệt hóa đơn
        /// </summary>
        public int? ApprovedBy { get; set; }

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

        /// <summary>
        /// Ngày duyệt
        /// </summary>
        public DateTimeOffset? ApprovedDate { get; set; }

        public string ApprovedDateDisplay => ApprovedDate.HasValue ? ApprovedDate.Value.ToString("dd/MM/yyyy HH:mm") : "";

        #endregion

        #region Giao dịch liên kết

        /// <summary>
        /// ID giao dịch liên kết
        /// </summary>
        public Guid? TransactionId { get; set; }

        #endregion

        #region Danh sách đơn hàng

        /// <summary>
        /// Danh sách đơn hàng trong hóa đơn
        /// </summary>
        public List<TransferPaymentBillOrderItem> Orders { get; set; } = new List<TransferPaymentBillOrderItem>();

        #endregion

        #region Hình ảnh chứng từ

        /// <summary>
        /// ID media chứng từ chuyển khoản
        /// </summary>
        public Guid? MediaId { get; set; }

        /// <summary>
        /// URL hình ảnh chứng từ chuyển khoản
        /// </summary>
        public string MediaUrl { get; set; } = string.Empty;

        #endregion

        #region Permissions

        /// <summary>
        /// Có thể chỉnh sửa không (chỉ người tạo và trạng thái Draft)
        /// </summary>
        public bool CanEdit { get; set; }

        /// <summary>
        /// Có thể hủy không (chỉ người tạo và trạng thái Draft)
        /// </summary>
        public bool CanCancel { get; set; }

        /// <summary>
        /// Có thể duyệt không (role Accountant và trạng thái Draft)
        /// </summary>
        public bool CanApprove { get; set; }

        #endregion
    }
}
