/**
 * Loại đối soát (ReconciliationType)
 */
export const ReconciliationType = {
  CollectMoney: 1, // Đối soát tiền thu hộ
  ShippingFee: 2, // Đối soát cước
};

/**
 * Nhãn hiển thị cho loại đối soát
 */
export const ReconciliationTypeLabels = {
  [ReconciliationType.CollectMoney]: "Đối soát tiền thu hộ",
  [ReconciliationType.ShippingFee]: "Đối soát cước",
};

/**
 * Danh sách loại đối soát để hiển thị trong dropdown
 */
export const ReconciliationTypeOptions = [
  {
    value: ReconciliationType.CollectMoney,
    label: ReconciliationTypeLabels[ReconciliationType.CollectMoney],
  },
  {
    value: ReconciliationType.ShippingFee,
    label: ReconciliationTypeLabels[ReconciliationType.ShippingFee],
  },
];

/**
 * Trạng thái đối soát (ReconciliationStatus)
 */
export const ReconciliationStatus = {
  Draft: 1, // Nháp
  Confirmed: 2, // Đã xác nhận
  Transferred: 3, // Đã chuyển tiền
  Cancelled: 8, // Đã hủy
};

/**
 * Nhãn hiển thị cho trạng thái đối soát
 */
export const ReconciliationStatusLabels = {
  [ReconciliationStatus.Draft]: "Nháp",
  [ReconciliationStatus.Confirmed]: "Đã xác nhận",
  [ReconciliationStatus.Transferred]: "Đã chuyển tiền",
  [ReconciliationStatus.Cancelled]: "Đã hủy",
};

/**
 * Màu sắc cho trạng thái đối soát
 */
export const ReconciliationStatusColors = {
  [ReconciliationStatus.Draft]: "orange", // Nháp
  [ReconciliationStatus.Confirmed]: "blue", // Đã xác nhận
  [ReconciliationStatus.Transferred]: "green", // Đã chuyển tiền
  [ReconciliationStatus.Cancelled]: "red", // Đã hủy
};

/**
 * CSS classes cho trạng thái đối soát
 */
export const ReconciliationStatusClasses = {
  [ReconciliationStatus.Draft]: "badge bg-warning text-dark",
  [ReconciliationStatus.Confirmed]: "badge bg-primary",
  [ReconciliationStatus.Transferred]: "badge bg-success",
  [ReconciliationStatus.Cancelled]: "badge bg-danger",
};

/**
 * Mức độ ưu tiên (ReconciliationPriority)
 */
export const ReconciliationPriority = {
  Low: 1, // Thấp
  Medium: 2, // Trung bình
  High: 3, // Cao
};

/**
 * Nhãn hiển thị cho mức độ ưu tiên
 */
export const PriorityLabels = {
  [ReconciliationPriority.Low]: "Thấp",
  [ReconciliationPriority.Medium]: "Trung bình",
  [ReconciliationPriority.High]: "Cao",
};

/**
 * Màu sắc cho mức độ ưu tiên
 */
export const PriorityColors = {
  [ReconciliationPriority.Low]: "green", // Thấp
  [ReconciliationPriority.Medium]: "orange", // Trung bình
  [ReconciliationPriority.High]: "red", // Cao
};

/**
 * CSS classes cho mức độ ưu tiên
 */
export const PriorityClasses = {
  [ReconciliationPriority.Low]: "badge bg-success",
  [ReconciliationPriority.Medium]: "badge bg-warning text-dark",
  [ReconciliationPriority.High]: "badge bg-danger",
};

/**
 * Trạng thái COD (OrderCodStage)
 */
export const OrderCodStage = {
  NotCollected: 1, // Chưa thu
  Head: 2, // Đã về tổng (có thể đối soát)
  Reconciled: 3, // Đã đối soát
};

/**
 * Nhãn hiển thị cho trạng thái COD
 */
export const OrderCodStageLabels = {
  [OrderCodStage.NotCollected]: "Chưa thu",
  [OrderCodStage.Head]: "Đã về tổng",
  [OrderCodStage.Reconciled]: "Đã đối soát",
};

/**
 * Hàm helper để lấy nhãn loại đối soát
 * @param {number} type - Loại đối soát
 * @returns {string} Nhãn hiển thị
 */
export function getReconciliationTypeLabel(type) {
  return ReconciliationTypeLabels[type] || "Không xác định";
}

/**
 * Hàm helper để lấy nhãn trạng thái đối soát
 * @param {number} status - Trạng thái
 * @returns {string} Nhãn hiển thị
 */
export function getReconciliationStatusLabel(status) {
  return ReconciliationStatusLabels[status] || "Không xác định";
}

/**
 * Hàm helper để lấy màu trạng thái đối soát
 * @param {number} status - Trạng thái
 * @returns {string} Màu sắc
 */
export function getReconciliationStatusColor(status) {
  return ReconciliationStatusColors[status] || "gray";
}

/**
 * Hàm helper để lấy CSS class trạng thái đối soát
 * @param {number} status - Trạng thái
 * @returns {string} CSS class
 */
export function getReconciliationStatusClass(status) {
  return ReconciliationStatusClasses[status] || "badge bg-secondary";
}

/**
 * Hàm helper để lấy nhãn mức độ ưu tiên
 * @param {number} priority - Mức độ ưu tiên
 * @returns {string} Nhãn hiển thị
 */
export function getPriorityLabel(priority) {
  return PriorityLabels[priority] || "Không xác định";
}

/**
 * Hàm helper để lấy màu mức độ ưu tiên
 * @param {number} priority - Mức độ ưu tiên
 * @returns {string} Màu sắc
 */
export function getPriorityColor(priority) {
  return PriorityColors[priority] || "gray";
}

/**
 * Hàm helper để lấy CSS class mức độ ưu tiên
 * @param {number} priority - Mức độ ưu tiên
 * @returns {string} CSS class
 */
export function getPriorityClass(priority) {
  return PriorityClasses[priority] || "badge bg-secondary";
}

/**
 * Hàm helper để lấy nhãn trạng thái COD
 * @param {number} stage - Trạng thái COD
 * @returns {string} Nhãn hiển thị
 */
export function getOrderCodStageLabel(stage) {
  return OrderCodStageLabels[stage] || "Không xác định";
}

/**
 * Kiểm tra xem phiếu đối soát có thể chỉnh sửa không
 * @param {number} status - Trạng thái phiếu đối soát
 * @returns {boolean} Có thể chỉnh sửa hay không
 */
export function canEditReconciliation(status) {
  return status === ReconciliationStatus.Draft;
}

/**
 * Kiểm tra xem phiếu đối soát có thể xác nhận không
 * @param {number} status - Trạng thái phiếu đối soát
 * @returns {boolean} Có thể xác nhận hay không
 */
export function canConfirmReconciliation(status) {
  return status === ReconciliationStatus.Draft;
}

/**
 * Kiểm tra xem phiếu đối soát có thể đánh dấu đã chuyển tiền không
 * @param {number} status - Trạng thái phiếu đối soát
 * @returns {boolean} Có thể đánh dấu đã chuyển tiền hay không
 */
export function canMarkAsTransferred(status) {
  return status === ReconciliationStatus.Confirmed;
}

/**
 * Kiểm tra xem phiếu đối soát có thể hủy không
 * @param {number} status - Trạng thái phiếu đối soát
 * @returns {boolean} Có thể hủy hay không
 */
export function canCancelReconciliation(status) {
  return (
    status === ReconciliationStatus.Draft ||
    status === ReconciliationStatus.Confirmed
  );
}

/**
 * Danh sách các trạng thái để hiển thị trong dropdown filter
 */
export const ReconciliationStatusOptions = [
  { value: null, label: "Tất cả trạng thái" },
  {
    value: ReconciliationStatus.Draft,
    label: ReconciliationStatusLabels[ReconciliationStatus.Draft],
  },
  {
    value: ReconciliationStatus.Confirmed,
    label: ReconciliationStatusLabels[ReconciliationStatus.Confirmed],
  },
  {
    value: ReconciliationStatus.Transferred,
    label: ReconciliationStatusLabels[ReconciliationStatus.Transferred],
  },
  {
    value: ReconciliationStatus.Cancelled,
    label: ReconciliationStatusLabels[ReconciliationStatus.Cancelled],
  },
];

/**
 * Danh sách các mức độ ưu tiên để hiển thị trong dropdown filter
 */
export const PriorityOptions = [
  { value: null, label: "Tất cả mức độ" },
  {
    value: ReconciliationPriority.High,
    label: PriorityLabels[ReconciliationPriority.High],
  },
  {
    value: ReconciliationPriority.Medium,
    label: PriorityLabels[ReconciliationPriority.Medium],
  },
  {
    value: ReconciliationPriority.Low,
    label: PriorityLabels[ReconciliationPriority.Low],
  },
];

/**
 * Phương thức chuyển tiền (TransferMethod)
 */
export const TransferMethod = {
  BankTransfer: 1, // Chuyển khoản ngân hàng
  Cash: 2, // Tiền mặt
  EWallet: 3, // Ví điện tử
  Check: 4, // Séc
  Other: 99, // Khác
};

/**
 * Nhãn hiển thị cho phương thức chuyển tiền
 */
export const TransferMethodLabels = {
  [TransferMethod.BankTransfer]: "Chuyển khoản ngân hàng",
  [TransferMethod.Cash]: "Tiền mặt",
  [TransferMethod.EWallet]: "Ví điện tử",
  [TransferMethod.Check]: "Séc",
  [TransferMethod.Other]: "Khác",
};

/**
 * Danh sách phương thức chuyển tiền để hiển thị trong dropdown
 */
export const TransferMethodOptions = [
  {
    value: TransferMethod.BankTransfer,
    label: TransferMethodLabels[TransferMethod.BankTransfer],
  },
  {
    value: TransferMethod.Cash,
    label: TransferMethodLabels[TransferMethod.Cash],
  },
  {
    value: TransferMethod.EWallet,
    label: TransferMethodLabels[TransferMethod.EWallet],
  },
  {
    value: TransferMethod.Check,
    label: TransferMethodLabels[TransferMethod.Check],
  },
  {
    value: TransferMethod.Other,
    label: TransferMethodLabels[TransferMethod.Other],
  },
];

/**
 * Hàm helper để lấy nhãn phương thức chuyển tiền
 * @param {number} method - Phương thức chuyển tiền
 * @returns {string} Nhãn hiển thị
 */
export function getTransferMethodLabel(method) {
  return TransferMethodLabels[method] || "Không xác định";
}

/**
 * Validation cho TransferReconciliationModel
 * @param {Object} model - Model cần validate
 * @returns {string[]} Danh sách lỗi
 */
export function validateTransferModel(model) {
  const errors = [];

  // ID đối soát
  if (!model.reconciliationId || model.reconciliationId <= 0) {
    errors.push("Vui lòng chọn đối soát");
  }

  // Phương thức chuyển tiền
  if (
    !model.transferMethod ||
    !Object.values(TransferMethod).includes(model.transferMethod)
  ) {
    errors.push("Vui lòng chọn phương thức chuyển tiền");
  }

  // Ghi chú
  if (model.note && model.note.length > 1024) {
    errors.push("Ghi chú không được vượt quá 1024 ký tự");
  }

  // Thông tin bổ sung
  if (model.additionalInfo && model.additionalInfo.length > 2048) {
    errors.push("Thông tin bổ sung không được vượt quá 2048 ký tự");
  }

  return errors;
}
