import type { PageParam, PageResult } from '@vben/request';

import { requestClient } from '#/api/request';

export namespace MesWmStockTakingTaskApi {
  /** 盘点任务 */
  export interface StockTakingTask {
    id?: number; // 任务编号
    code?: string; // 任务编码
    name?: string; // 任务名称
    takingDate?: string; // 盘点日期
    type?: number; // 盘点类型
    userId?: number; // 盘点人用户编号
    userNickname?: string; // 盘点人名称
    planId?: number; // 盘点方案编号
    planCode?: string; // 盘点方案编码
    planName?: string; // 盘点方案名称
    blindFlag?: boolean; // 是否盲盘
    frozen?: boolean; // 是否冻结库存
    startTime?: number; // 开始时间
    endTime?: number; // 结束时间
    status?: number; // 单据状态
    reviewerId?: number; // 审核人用户编号
    reviewerName?: string; // 审核人姓名
    reviewTime?: number; // 结果审批提交时间 / 审核时间
    reviewRemark?: string; // 审核意见（通过时的意见 / 不通过时的原因）
    remark?: string; // 备注
    createTime?: string; // 创建时间
  }
}

/** 查询盘点任务分页 */
export function getStockTakingPage(params: PageParam) {
  return requestClient.get<PageResult<MesWmStockTakingTaskApi.StockTakingTask>>(
    '/mes/wm/stocktaking-task/page',
    { params },
  );
}

/** 查询盘点任务详情 */
export function getStockTaking(id: number) {
  return requestClient.get<MesWmStockTakingTaskApi.StockTakingTask>(
    `/mes/wm/stocktaking-task/get?id=${id}`,
  );
}

/** 新增盘点任务 */
export function createStockTaking(
  data: MesWmStockTakingTaskApi.StockTakingTask,
) {
  return requestClient.post<number>('/mes/wm/stocktaking-task/create', data);
}

/** 修改盘点任务 */
export function updateStockTaking(
  data: MesWmStockTakingTaskApi.StockTakingTask,
) {
  return requestClient.put('/mes/wm/stocktaking-task/update', data);
}

/** 删除盘点任务 */
export function deleteStockTaking(id: number) {
  return requestClient.delete(`/mes/wm/stocktaking-task/delete?id=${id}`);
}

/** 开始盘点（提交盘点任务） */
export function submitStockTaking(id: number) {
  return requestClient.put('/mes/wm/stocktaking-task/submit', null, {
    params: { id },
  });
}

/** 取消盘点任务 */
export function cancelStockTaking(id: number) {
  return requestClient.put('/mes/wm/stocktaking-task/cancel', null, {
    params: { id },
  });
}

/**
 * 提交盘点结果审批（盘点中 → 盘点中·结果审批中）
 *
 * 审核人由「系统管理 - 审批配置」按业务类型统一配置，提交时无需指定；
 * 未启用审批或未配置有效审核人时后端会抛出业务异常。
 */
export function submitStockTakingApproval(id: number) {
  return requestClient.put('/mes/wm/stocktaking-task/submit-approval', null, {
    params: { id },
  });
}

/**
 * 获得盘点结果审批的审核人编号集合
 *
 * 供列表页判断当前登录用户是否应展示「审核 / 审核不通过」按钮；未配置时返回空数组。
 */
export function getStockTakingApproverIds() {
  return requestClient.get<number[]>('/mes/wm/stocktaking-task/approver-ids');
}

/**
 * 审核盘点结果（结果审批中 → 已完成 / 盘点中）
 *
 * 仅审批配置中的审核人可调用（多人时或签）；pass=false 时 reviewRemark（不通过原因）必填。
 */
export function auditStockTakingResult(
  id: number,
  pass: boolean,
  reviewRemark?: string,
) {
  return requestClient.put('/mes/wm/stocktaking-task/audit', {
    id,
    pass,
    reviewRemark,
  });
}

/** 导出盘点任务 */
export function exportStockTaking(params: any) {
  return requestClient.download('/mes/wm/stocktaking-task/export-excel', {
    params,
  });
}
