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

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

export namespace MesProBagCodeApi {
  /** 袋码（一袋一码） */
  export interface BagCode {
    id?: number; // 编号
    uuid?: string; // 生成组 UUID
    code?: string; // 袋码（二维码内容）
    bagNo?: number; // 批次内袋序号
    batchId?: number; // 生产批次编号
    batchCode?: string; // 批次号
    lineCode?: string; // 产线编码
    lineName?: string; // 产线名称
    palletId?: number; // 绑定托盘编号
    palletCode?: string; // 托盘码
    status?: number; // 状态（字典 mes_pro_bag_code_status）
    printTime?: string; // 导出（交付印刷）时间
    cancelTime?: string; // 作废时间
    cancelReason?: string; // 作废原因
    remark?: string; // 备注
    createTime?: string; // 创建时间
  }

  /** 袋码分页查询参数 */
  export interface PageParams extends PageParam {
    code?: string;
    batchId?: number;
    batchCode?: string;
    uuid?: string;
    palletId?: number;
    status?: number;
    createTime?: string[];
  }

  /** 生成数据包请求 */
  export interface GenerateParams {
    count: number; // 生成袋数
    remark?: string; // 备注
  }

  export interface GenerateResult {
    uuid?: string;
  }

  export interface BindBatchParams {
    batchId: number;
    ids: number[];
  }

  /** 绑定/解绑托盘请求 */
  export interface BindParams {
    palletId: number; // 托盘编号
    ids: number[]; // 袋码编号列表
  }

  /** 破损袋码替换请求 */
  export interface ReplaceParams {
    batchId: number; // 生产批次编号
    oldIds: number[]; // 待替换旧袋码编号列表
    reason: string; // 替换原因
  }

  /** 破损袋码替换明细 */
  export interface ReplaceItem {
    oldBagCodeId?: number;
    oldCode?: string;
    oldBagNo?: number;
    oldStatus?: number;
    oldPalletId?: number;
    oldPalletCode?: string;
    newBagCodeId?: number;
    newCode?: string;
    newBagNo?: number;
    newPalletId?: number;
    newPalletCode?: string;
    reason?: string;
    replaceTime?: string;
  }

  /** 破损袋码替换结果 */
  export interface ReplaceResult {
    replaceUuid?: string;
    batchId?: number;
    batchCode?: string;
    count?: number;
    items?: ReplaceItem[];
  }

  /** 扫码追溯信息 */
  export interface BagCodeTrace {
    id?: number; // 袋码编号
    code?: string; // 袋码（二维码内容）
    bagNo?: number; // 袋序号
    status?: number; // 袋码状态
    printTime?: string; // 导出印刷时间
    cancelTime?: string; // 作废时间
    cancelReason?: string; // 作废原因
    replacementUuid?: string; // 替换组 UUID
    replacedByCode?: string; // 替换后的新袋码
    replacementOfCode?: string; // 被替换的旧袋码
    batchId?: number; // 批次编号
    batchCode?: string; // 批次号
    batchStatus?: number; // 批次状态
    produceDate?: string; // 生产日期
    lineCode?: string; // 产线编码
    lineName?: string; // 产线名称
    ownerUserId?: number; // 责任人编号
    ownerUserName?: string; // 责任人昵称
    palletId?: number; // 托盘编号
    palletCode?: string; // 托盘码
    itemId?: number; // 品种（物料）编号
    itemCode?: string; // 品种编码
    itemName?: string; // 品种名称
    itemSpecification?: string; // 品种规格
  }
}

/** 生成袋码数据包（返回生成组 UUID） */
export function generateBagCodes(data: MesProBagCodeApi.GenerateParams) {
  return requestClient.post<MesProBagCodeApi.GenerateResult>(
    '/mes/pro/bag-code/generate',
    data,
  );
}

/** 录入生产批次 */
export function bindBagCodeBatch(data: MesProBagCodeApi.BindBatchParams) {
  return requestClient.put('/mes/pro/bag-code/bind-batch', data);
}

/** 删除袋码生成组 */
export function deleteBagCodesByUuid(uuid: string) {
  return requestClient.delete(`/mes/pro/bag-code/delete-by-uuid?uuid=${uuid}`);
}

/** 袋码绑定托盘 */
export function bindBagCodePallet(data: MesProBagCodeApi.BindParams) {
  return requestClient.put('/mes/pro/bag-code/bind-pallet', data);
}

/** 袋码解绑托盘 */
export function unbindBagCodePallet(data: MesProBagCodeApi.BindParams) {
  return requestClient.put('/mes/pro/bag-code/unbind-pallet', data);
}

/** 作废破损袋码并生成等量替换袋码 */
export function replaceBagCodes(data: MesProBagCodeApi.ReplaceParams) {
  return requestClient.post<MesProBagCodeApi.ReplaceResult>(
    '/mes/pro/bag-code/replace',
    data,
  );
}

/** 查询袋码详情 */
export function getBagCode(id: number) {
  return requestClient.get<MesProBagCodeApi.BagCode>(
    `/mes/pro/bag-code/get?id=${id}`,
  );
}

/** 扫码追溯：根据袋码反查批次、产线、责任人等信息 */
export function getBagCodeByCode(code: string) {
  return requestClient.get<MesProBagCodeApi.BagCodeTrace>(
    `/mes/pro/bag-code/get-by-code?code=${encodeURIComponent(code)}`,
  );
}

/** 查询袋码分页 */
export function getBagCodePage(params: MesProBagCodeApi.PageParams) {
  return requestClient.get<PageResult<MesProBagCodeApi.BagCode>>(
    '/mes/pro/bag-code/page',
    { params },
  );
}

/** 查询生成组的袋码列表 */
export function getBagCodeListByUuid(uuid: string) {
  return requestClient.get<MesProBagCodeApi.BagCode[]>(
    `/mes/pro/bag-code/list-by-uuid?uuid=${uuid}`,
  );
}

/** 批量导出袋码 Excel（交付印刷） */
export function exportBagCodeExcel(params: MesProBagCodeApi.PageParams) {
  return requestClient.download('/mes/pro/bag-code/export-excel', { params });
}

/** 批量导出袋码二维码图片 ZIP（uuid 优先，否则按 batchId） */
export function exportBagQr(params: { uuid?: string; batchId?: number }) {
  return requestClient.download('/mes/pro/bag-code/export-qr', { params });
}
