import request from "@/utils/request";

const GENERATOR_BASE_URL = "/api/v1/codegen";

const GeneratorAPI = {
  /** 获取数据表分页列表 */
  getTablePage(params: TablePageQuery) {
    return request<any, PageResult<TablePageVO[]>>({
      url: `${GENERATOR_BASE_URL}/table/page`,
      method: "get",
      params,
    });
  },

  /** 获取代码生成配置 */
  getGenConfig(tableName: string) {
    return request<any, GenConfigForm>({
      url: `${GENERATOR_BASE_URL}/${tableName}/config`,
      method: "get",
    });
  },

  /** 获取代码生成配置 */
  saveGenConfig(tableName: string, data: GenConfigForm) {
    return request({
      url: `${GENERATOR_BASE_URL}/${tableName}/config`,
      method: "post",
      data,
    });
  },

  /** 获取代码生成预览数据 */
  getPreviewData(tableName: string, pageType?: "classic" | "curd") {
    return request<any, GeneratorPreviewVO[]>({
      url: `${GENERATOR_BASE_URL}/${tableName}/preview`,
      method: "get",
      params: pageType ? { pageType } : undefined,
    });
  },

  /** 重置代码生成配置 */
  resetGenConfig(tableName: string) {
    return request({
      url: `${GENERATOR_BASE_URL}/${tableName}/config`,
      method: "delete",
    });
  },

  /**
   * 下载 ZIP 文件
   * @param url
   * @param fileName
   */
  download(tableName: string, pageType?: "classic" | "curd") {
    return request({
      url: `${GENERATOR_BASE_URL}/${tableName}/download`,
      method: "get",
      params: pageType ? { pageType } : undefined,
      responseType: "blob",
    }).then((response) => {
      const fileName = decodeURI(
        response.headers["content-disposition"].split(";")[1].split("=")[1]
      );

      const blob = new Blob([response.data], { type: "application/zip" });
      const a = document.createElement("a");
      const url = window.URL.createObjectURL(blob);
      a.href = url;
      a.download = fileName;
      a.click();
      window.URL.revokeObjectURL(url);
    });
  },
};

export default GeneratorAPI;

/** 代码生成预览对象 */
export interface GeneratorPreviewVO {
  /** 文件生成路径 */
  path: string;
  /** 文件名称 */
  fileName: string;
  /** 文件内容 */
  content: string;
}

/**  数据表分页查询参数 */
export interface TablePageQuery extends PageQuery {
  /** 关键字(表名) */
  keywords?: string;
}

/** 数据表分页对象 */
export interface TablePageVO {
  /** 表名称 */
  tableName: string;

  /** 表描述 */
  tableComment: string;

  /** 存储引擎 */
  engine: string;

  /** 字符集排序规则 */
  tableCollation: string;

  /** 创建时间 */
  createTime: string;
}

/** 代码生成配置表单 */
export interface GenConfigForm {
  /** 主键 */
  id?: string;

  /** 表名 */
  tableName?: string;

  /** 业务名 */
  businessName?: string;

  /** 模块名 */
  moduleName?: string;

  /** 包名 */
  packageName?: string;

  /** 实体名 */
  entityName?: string;

  /** 作者 */
  author?: string;

  /** 上级菜单 */
  parentMenuId?: string;

  /** 后端应用名 */
  backendAppName?: string;
  /** 前端应用名 */
  frontendAppName?: string;

  /** 字段配置列表 */
  fieldConfigs?: FieldConfig[];

  /** 页面类型 classic|curd */
  pageType?: "classic" | "curd";

  /** 要移除的表前缀，如 sys_ */
  removeTablePrefix?: string;
}

/** 字段配置 */
export interface FieldConfig {
  /** 主键 */
  id?: string;

  /** 列名 */
  columnName?: string;

  /** 列类型 */
  columnType?: string;

  /** 字段名 */
  fieldName?: string;

  /** 字段类型 */
  fieldType?: string;

  /** 字段描述 */
  fieldComment?: string;

  /** 是否在列表显示 */
  isShowInList?: number;

  /** 是否在表单显示 */
  isShowInForm?: number;

  /** 是否在查询条件显示 */
  isShowInQuery?: number;

  /** 是否必填 */
  isRequired?: number;

  /** 表单类型 */
  formType?: number;

  /** 查询类型 */
  queryType?: number;

  /** 字段长度 */
  maxLength?: number;

  /** 字段排序 */
  fieldSort?: number;

  /** 字典类型 */
  dictType?: string;
}
