/**
 * 文件职责：商品列表交互动作。
 * 1. 管理筛选应用、重置、分页切换。
 * 2. 管理列表勾选状态（单选、全选、清空）。
 */
import type { Ref } from 'vue';

import type {
  ProductFilterState,
  ProductPaginationChangePayload,
} from '#/views/product/list/types';

interface CreateListActionsOptions {
  filters: ProductFilterState;
  loadProducts: () => Promise<void>;
  selectedProductIds: Ref<string[]>;
}

export function createListActions(options: CreateListActionsOptions) {
  /** 清空当前勾选。 */
  function clearSelection() {
    options.selectedProductIds.value = [];
  }

  /** 切换单个商品勾选。 */
  function toggleSelectProduct(productId: string, checked: boolean) {
    const idSet = new Set(options.selectedProductIds.value);
    if (checked) {
      idSet.add(productId);
    } else {
      idSet.delete(productId);
    }
    options.selectedProductIds.value = [...idSet];
  }

  /** 按当前页 ID 执行全选/反选。 */
  function toggleSelectAllOnPage(currentPageIds: string[], checked: boolean) {
    const idSet = new Set(options.selectedProductIds.value);
    if (checked) {
      for (const id of currentPageIds) {
        idSet.add(id);
      }
    } else {
      for (const id of currentPageIds) {
        idSet.delete(id);
      }
    }
    options.selectedProductIds.value = [...idSet];
  }

  /** 应用筛选条件并回到第一页。 */
  async function applyFilters() {
    options.filters.page = 1;
    await options.loadProducts();
    clearSelection();
  }

  /** 重置筛选后重新查询列表。 */
  async function resetFilters() {
    options.filters.keyword = '';
    options.filters.status = '';
    options.filters.kind = '';
    options.filters.categoryId = '';
    options.filters.page = 1;
    options.filters.pageSize = 12;
    await options.loadProducts();
    clearSelection();
  }

  /** 处理分页变化。 */
  async function changePage(payload: ProductPaginationChangePayload) {
    options.filters.page = payload.page;
    options.filters.pageSize = payload.pageSize;
    await options.loadProducts();
    clearSelection();
  }

  return {
    applyFilters,
    changePage,
    clearSelection,
    resetFilters,
    toggleSelectAllOnPage,
    toggleSelectProduct,
  };
}
