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

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

export namespace QcReportInstanceApi {
  /** 智能质检报告实例 */
  export interface Instance {
    id?: number; // 实例编号
    reportNo?: string; // 报告编号（业务唯一）
    templateId?: number; // 模板编号
    templateVersion?: string; // 生成时使用的模板版本号
    businessId?: string; // 业务单据编号
    businessType?: string; // 业务单据类型
    status?: number; // 报告状态：0生成中 1生成成功 2生成失败
    creator?: string; // 创建人
    createTime?: Date; // 创建时间
    updateTime?: Date; // 更新时间
  }

  /**
   * 实例详情。
   * <p>
   * 比列表多一个 {@link renderHtml}——那是出件时冻结下来的产物，用 iframe 直接渲染即为「预览」，
   * 不需要重新出件。数据快照不在这个接口里，要看得单独调 {@link QcReportInstanceApi.Instance} 的 snapshot。
   */
  export interface InstanceDetail extends Instance {
    renderHtml?: string; // 渲染产物 HTML
  }

  /** PDF 出件结果 */
  export interface PdfResult {
    id: number; // 实例编号
    reportNo: string; // 报告编号
    fileName: string; // PDF 文件名
    byteSize: number; // PDF 字节数
    blobId?: number; // 文件编号
    attachmentId?: number; // 附件关联编号
    previewURL?: string; // 预览地址（临时签名，会过期）
    downloadURL?: string; // 下载地址（临时签名，会过期）
    durationMs?: number; // 本次出件总耗时（毫秒）
    pdfDurationMs?: number; // 打印耗时（毫秒）
    browserStatus?: string; // 浏览器状态：READY / RESTARTED
  }

  /**
   * 由质检单出件的入参。
   * <p>
   * 这里刻意没有 context——数据全部由后端从 MES 质检单取，前端只负责选「哪张单据 + 哪张模板」。
   */
  export interface GenerateFromQcReq {
    qcType: number; // 质检类型：1 来料 2 过程 3 出货 4 退货
    qcId: number; // 质检单编号（四张表各自的主键）
    templateId: number; // 报告模板编号，其 reportType 必须与 qcType 一致
    version?: string; // 模板版本号，不传取模板 currentVersion
    reportNo?: string; // 报告编号，不传由后端按 QR+日期+流水 生成
  }

  /** 由质检单出件的结果 */
  export interface GenerateFromQcResult {
    id: number; // 报告实例编号，拿去跳详情/反查
    reportNo: string; // 最终生效的报告编号
    templateVersion: string; // 本次使用的模板版本号
    itemCount: number; // 写入报告的检验项条数（不等于质检单行数）
    undecidableCount: number; // 待判定项数，大于 0 必须提示用户
    warnings?: string[]; // 数据取舍的软提示：分组标题被跳过 / 指标已删 / 未录实测值 / 样品数过多
    errors?: string[]; // 渲染期数据缺口（模板绑定了但没数据的字段）
  }
}

/** 查询报告实例分页 */
export function getInstancePage(params: PageParam) {
  return requestClient.get<PageResult<QcReportInstanceApi.Instance>>(
    '/qc-report/instance/page',
    { params },
  );
}

/** 查询报告实例详情（含渲染产物 HTML，不含数据快照） */
export function getInstance(id: number) {
  return requestClient.get<QcReportInstanceApi.InstanceDetail>(
    `/qc-report/instance/get?id=${id}`,
  );
}

/** 查询报告实例冻结的数据快照 */
export function getInstanceSnapshot(id: number) {
  return requestClient.get<Record<string, unknown>>(
    `/qc-report/instance/snapshot?id=${id}`,
  );
}

/** 导出 PDF（打印实例已存的渲染产物并归档到附件库，可重复调用） */
export function exportInstancePdf(id: number) {
  return requestClient.post<QcReportInstanceApi.PdfResult>(
    `/qc-report/instance/pdf?id=${id}`,
  );
}

/** 删除报告实例 */
export function deleteInstance(id: number) {
  return requestClient.delete(`/qc-report/instance/delete?id=${id}`);
}

/**
 * 由质检单（IQC/IPQC/OQC/RQC）直接生成报告。
 * <p>
 * 数据由后端经 MesQcReportApi 从 MES 取，前端不拼 context。
 * 调用前五道校验按业务优先级只报第一处；失败都是「数据或选择不对」，重试无用，按报文改数据或换模板。
 */
export function generateInstanceFromQc(
  data: QcReportInstanceApi.GenerateFromQcReq,
) {
  return requestClient.post<QcReportInstanceApi.GenerateFromQcResult>(
    '/qc-report/instance/generate-from-qc',
    data,
  );
}
