using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Enums;
using Lada.Framework.DTO;
using Lada.Framework.Infrastructures.Helpers;

namespace Ladaer.BackEnd.Infrastructures.DTO.Items.Finances
{
    /// <summary>
    /// Item hiển thị trong danh sách đối soát
    /// </summary>
    public class ReconciliationItem : BaseItem<int>
    {
        /// <summary>
        /// Mã đối soát
        /// </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>
        /// 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 => Status.GetDescription();

        /// <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 => Type.GetDescription();

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

        /// <summary>
        /// Tên công ty xuất hóa đơn VAT
        /// </summary>
        public string VatCompanyName { get; set; } = string.Empty;

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

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

        /// <summary>
        /// Có thể xác nhận không (chỉ check status)
        /// </summary>
        public bool CanConfirm => Status == ReconciliationStatus.Draft;

        /// <summary>
        /// Có thể chuyển tiền không (chỉ check status)
        /// </summary>
        public bool CanTransfer => Status == ReconciliationStatus.Confirmed;

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

        /// <summary>
        /// User có quyền duyệt đối soát không (Reconciliation.Confirm hoặc Founder)
        /// </summary>
        public bool HasConfirmPermission { get; set; }

        /// <summary>
        /// User có quyền cập nhật chuyển tiền đối soát không (Reconciliation.Transfer hoặc Founder)
        /// </summary>
        public bool HasTransferPermission { get; set; }

        /// <summary>
        /// Có thể xác nhận không (kết hợp cả status và quyền)
        /// </summary>
        public bool CanConfirmWithPermission => CanConfirm && HasConfirmPermission;

        /// <summary>
        /// Có thể chuyển tiền không (kết hợp cả status và quyền)
        /// </summary>
        public bool CanTransferWithPermission => CanTransfer && HasTransferPermission;
    }
}
