/**
 * 文件职责：商品列表页面类型定义。
 * 1. 维护筛选、分页、抽屉表单等页面状态类型。
 * 2. 约束组件通信与批量动作入参。
 */
import type {
  BatchProductActionType,
  ProductKind,
  ProductSoldoutMode,
  ProductStatus,
} from '#/api/product';

/** 页面视图模式。 */
export type ProductViewMode = 'card' | 'list';

/** 商品筛选条件。 */
export interface ProductFilterState {
  categoryId: string;
  kind: '' | ProductKind;
  keyword: string;
  page: number;
  pageSize: number;
  status: '' | ProductStatus;
}

/** 侧栏分类项。 */
export interface ProductCategorySidebarItem {
  id: string;
  name: string;
  productCount: number;
}

/** 商品编辑抽屉模式。 */
export type ProductEditorDrawerMode = 'create' | 'edit';

/** 套餐分组商品编辑态。 */
export interface ProductEditorComboItemState {
  productId: string;
  productName: string;
  quantity: number;
  sortOrder: number;
}

/** 套餐分组编辑态。 */
export interface ProductEditorComboGroupState {
  items: ProductEditorComboItemState[];
  maxSelect: number;
  minSelect: number;
  name: string;
  sortOrder: number;
}

/** 商品编辑表单。 */
export interface ProductEditorFormState {
  categoryId: string;
  comboGroups: ProductEditorComboGroupState[];
  description: string;
  id: string;
  imageUrls: string[];
  kind: ProductKind;
  name: string;
  originalPrice: null | number;
  price: number;
  shelfMode: 'draft' | 'now' | 'scheduled';
  status: ProductStatus;
  stock: number;
  subtitle: string;
  tagsText: string;
  timedOnShelfAt: string;
}

/** 快速编辑表单。 */
export interface ProductQuickEditFormState {
  id: string;
  isOnSale: boolean;
  originalPrice: null | number;
  price: number;
  stock: number;
}

/** 沽清表单。 */
export interface ProductSoldoutFormState {
  mode: ProductSoldoutMode;
  notifyManager: boolean;
  reason: string;
  recoverAt: string;
  remainStock: number;
  syncToPlatform: boolean;
}

/** 列表分页变更参数。 */
export interface ProductPaginationChangePayload {
  page: number;
  pageSize: number;
}

/** 批量动作类型（页面层）。 */
export type ProductBatchAction = BatchProductActionType;

/** 商品状态展示元信息。 */
export interface ProductStatusMeta {
  badgeClass: string;
  color: string;
  label: string;
}
