import type { DmsCustomBarcode } from '#/api/x/dms/watermarkParameters';

export interface DmsFixedPrintNumber {
  serialNumber: string;
  countSerialNumber?: string;
  taskSequence?: number;
}

/** 在线配置负责显示格式，接口仍接收原 customBarcode 数组。 */
export type DmsPrintBarcodeBuilder = (number: Readonly<DmsFixedPrintNumber>) => DmsCustomBarcode[] | Promise<DmsCustomBarcode[]>;

export async function buildDmsPrintBarcode(number: DmsFixedPrintNumber, builder?: DmsPrintBarcodeBuilder): Promise<DmsCustomBarcode[]> {
  const entries = builder
    ? await builder(Object.freeze({ ...number }))
    : [
        {
          barValue: number.serialNumber,
          barText: `打印流水号: ${number.serialNumber}${number.countSerialNumber ? `  计数流水号: ${number.countSerialNumber}` : ''}`,
        },
      ];
  // 格式可变，编码身份和每页覆盖不变，不能用预览的第一份号覆盖后续份号。
  if (
    !Array.isArray(entries) ||
    entries.length !== 1 ||
    entries[0]?.barValue !== number.serialNumber ||
    entries[0]?.page != null ||
    typeof entries[0]?.barText !== 'string' ||
    !entries[0].barText.trim()
  ) {
    throw new Error('打印条码配置必须使用当前固定流水号，提供显示文字并覆盖每页');
  }
  return entries.map((entry) => ({ ...entry }));
}

/** 每次预览/发送读取在线接口；不做跨操作缓存，修改格式无需重启。 */
export function createDmsPrintBarcodeBuilder(interfaceId: string): DmsPrintBarcodeBuilder {
  if (!interfaceId.trim()) throw new Error('未配置打印流水显示格式接口');
  return async (number) => {
    const { getDataInterfaceDataSelect } = await import('#/api/systemData/dataInterface');
    const response = await getDataInterfaceDataSelect({
      interfaceId,
      currentPage: 1,
      pageSize: 2,
      paramList: [
        { field: 'dayin_liushuihao', defaultValue: number.serialNumber },
        { field: 'jishu_liushuihao', defaultValue: number.countSerialNumber || '' },
      ],
    });
    if (response.code !== 200 || !Array.isArray(response.data?.list) || response.data.list.length !== 1) {
      throw new Error('打印流水显示格式接口必须返回一条有效配置，请检查在线数据接口');
    }
    return buildDmsPrintBarcode(number, () => response.data.list);
  };
}
