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

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

export namespace QcReportVersionApi {
  /** 纸张页边距，单位 mm */
  export interface SchemaMargin {
    top?: number;
    right?: number;
    bottom?: number;
    left?: number;
  }

  /** 纸张配置 */
  export interface SchemaPage {
    size?: string; // A3 / A4 / A5 / Letter
    orientation?: string; // portrait / landscape
    margin?: SchemaMargin;
  }

  /**
   * 画布上的一个质量组件节点，只记「是谁、在哪、什么属性」
   * 嵌套结构以 grapes 为准，这里不再存一份树，避免两个真相来源对不上
   */
  export interface QualityComponentNode {
    /** 画布内组件 id */
    id?: string;
    /** 组件在文档中的顺序，供绑定与定位使用 */
    index?: number;
    /** 组件类型，即画布节点上的 data-quality-type */
    qualityType?: string;
    /** 组件的业务属性，取值是 data-qc-* / data-quality-type 这类属性 */
    attributes?: Record<string, unknown>;
  }

  /** 判定规则：scope 为 item 时逐项判定，为 report 时决定整份报告的结论 */
  export interface SchemaRule {
    id?: string;
    name?: string;
    scope?: 'item' | 'report';
    expression?: string;
    enabled?: boolean;
  }

  /**
   * 模板 Schema —— 设计器产物，也是报告出件的唯一输入
   *
   * 字段分工：grapes 是 GrapesJS 原始项目数据（设计器还原画布用，渲染引擎也读它，
   * 正文结构在这里）；components 是质量组件业务语义清单（渲染不读）；rules 是判定规则。
   *
   * 契约版本 1.1：删除了 1.0 时期的 dataSources / bindings / styles —— 它们始终是空数组，
   * 既无人写入也无人读取。后端 ReportTemplateSchema 已同步删除，两端必须一起改。
   */
  export interface ReportTemplateSchema {
    schemaVersion?: string;
    page?: SchemaPage;
    grapes?: Record<string, unknown>;
    components?: QualityComponentNode[];
    rules?: SchemaRule[];
  }

  /** 模板版本 */
  export interface Version {
    id?: number;
    templateId?: number;
    version?: string;
    schema?: ReportTemplateSchema;
    status?: number; // 0草稿 1已发布 2已停用
    description?: string;
    creator?: string;
    createTime?: Date;
    updateTime?: Date;
  }

  /** 创建版本入参：version 留空由后端按最新版本自增 */
  export interface VersionCreateReq {
    templateId: number;
    version?: string;
    schema?: ReportTemplateSchema;
    description?: string;
  }

  /** 更新版本入参：仅允许改设计内容与说明 */
  export interface VersionUpdateReq {
    id: number;
    schema?: ReportTemplateSchema;
    description?: string;
  }
}

/** 查询模板版本分页 */
export function getVersionPage(params: PageParam) {
  return requestClient.get<PageResult<QcReportVersionApi.Version>>(
    '/qc-report/template-version/page',
    { params },
  );
}

/** 查询模板版本详情 */
export function getVersion(id: number) {
  return requestClient.get<QcReportVersionApi.Version>(
    `/qc-report/template-version/get?id=${id}`,
  );
}

/** 查询模板的所有版本 */
export function getVersionListByTemplate(templateId: number) {
  return requestClient.get<QcReportVersionApi.Version[]>(
    `/qc-report/template-version/list-by-template?templateId=${templateId}`,
  );
}

/** 创建模板版本，返回版本编号 */
export function createVersion(data: QcReportVersionApi.VersionCreateReq) {
  return requestClient.post<number>('/qc-report/template-version/create', data);
}

/** 更新模板版本 */
export function updateVersion(data: QcReportVersionApi.VersionUpdateReq) {
  return requestClient.put('/qc-report/template-version/update', data);
}

/** 删除模板版本（仅草稿） */
export function deleteVersion(id: number) {
  return requestClient.delete(`/qc-report/template-version/delete?id=${id}`);
}

/** 发布模板版本 */
export function publishVersion(id: number) {
  return requestClient.post(`/qc-report/template-version/publish?id=${id}`);
}

/** 回滚到指定历史版本 */
export function rollbackVersion(id: number) {
  return requestClient.post(`/qc-report/template-version/rollback?id=${id}`);
}

/** 停用模板版本 */
export function disableVersion(id: number) {
  return requestClient.post(`/qc-report/template-version/disable?id=${id}`);
}