/**
 * ============================================================
 * 主执行脚本 — 创建全部多维表格数据表
 * ============================================================
 * 
 * 执行步骤:
 *   1. 获取 access_token
 *   2. 依次创建 7 张工作表
 *   3. 为每张表创建所有字段
 *   4. 输出执行结果报告
 * 
 * 使用方法:
 *   1. 确保已在 config.js 中填写正确的 APP_ID, APP_SECRET, FILE_ID
 *   2. 运行: node create-tables.js
 * 
 * 环境要求:
 *   - Node.js >= 18 (内置 fetch)
 *   - 若 Node.js < 18，请先安装: npm install node-fetch
 */

const { createSheet, createFields, log, logError } = require("./api-client");
const { ALL_TABLES } = require("./table-definitions");

// ============================================================
//  主流程
// ============================================================

async function main() {
  console.log("╔══════════════════════════════════════════════════════╗");
  console.log("║   金山多维表格 — 项目部署管理系统 表结构创建脚本      ║");
  console.log("║   参考: claude-dds.md + gemini-dds.md               ║");
  console.log("╚══════════════════════════════════════════════════════╝");
  console.log();

  const report = {
    success: [],
    failed: [],
    sheetIds: {},
  };

  // ---- Step 1: 逐表创建 ----
  for (let i = 0; i < ALL_TABLES.length; i++) {
    const tableDef = ALL_TABLES[i];
    const stepNum = i + 1;

    console.log(`\n${"=".repeat(60)}`);
    console.log(`📋 [${stepNum}/${ALL_TABLES.length}] 创建表: ${tableDef.name}`);
    console.log(`   ${tableDef.description}`);
    console.log(`   字段数量: ${tableDef.fields.length}`);
    console.log("=".repeat(60));

    try {
      // 创建工作表
      const sheetResult = await createSheet(tableDef.name);
      const sheetId =
        sheetResult?.data?.sheet_id ||
        sheetResult?.sheet_id ||
        sheetResult?.data?.id;

      if (!sheetId) {
        throw new Error(
          `创建工作表成功但未返回 sheet_id, 响应: ${JSON.stringify(sheetResult)}`
        );
      }

      report.sheetIds[tableDef.name] = sheetId;
      log(`  sheet_id = ${sheetId}`);

      // 创建字段
      const fieldResults = await createFields(sheetId, tableDef.fields);

      // 统计字段创建结果
      const successCount = fieldResults.filter((r) => r.success).length;
      const failCount = fieldResults.filter((r) => !r.success).length;

      console.log(
        `\n  📊 字段创建完成: ✅ ${successCount} 成功, ❌ ${failCount} 失败`
      );

      if (failCount > 0) {
        console.log("  失败的字段:");
        fieldResults
          .filter((r) => !r.success)
          .forEach((r) => console.log(`    - ${r.field}: ${r.error}`));
      }

      report.success.push({
        table: tableDef.name,
        sheetId,
        fieldsTotal: tableDef.fields.length,
        fieldsSuccess: successCount,
        fieldsFailed: failCount,
      });
    } catch (err) {
      logError(`创建表 "${tableDef.name}" 失败`, err);
      report.failed.push({
        table: tableDef.name,
        error: err.message,
      });
    }
  }

  // ---- Step 2: 输出执行报告 ----
  console.log("\n\n");
  console.log("╔══════════════════════════════════════════════════════╗");
  console.log("║                   📊 执行结果报告                    ║");
  console.log("╚══════════════════════════════════════════════════════╝");

  console.log("\n✅ 成功创建的表:");
  if (report.success.length > 0) {
    report.success.forEach((s) => {
      console.log(
        `   📋 ${s.table} (sheet_id: ${s.sheetId}) — 字段: ${s.fieldsSuccess}/${s.fieldsTotal}`
      );
    });
  } else {
    console.log("   (无)");
  }

  if (report.failed.length > 0) {
    console.log("\n❌ 创建失败的表:");
    report.failed.forEach((f) => {
      console.log(`   ⚠️  ${f.table}: ${f.error}`);
    });
  }

  // ---- Step 3: 输出 Sheet ID 映射 (后续关联字段需要) ----
  console.log("\n📌 Sheet ID 映射表 (建立关联字段时需要使用):");
  console.log("─".repeat(50));
  Object.entries(report.sheetIds).forEach(([name, id]) => {
    console.log(`   ${name.padEnd(30)} → ${id}`);
  });

  // ---- Step 4: 提醒人工操作 ----
  console.log("\n\n");
  console.log("╔══════════════════════════════════════════════════════╗");
  console.log("║              🔧 人工操作清单 (必做)                  ║");
  console.log("╚══════════════════════════════════════════════════════╝");
  console.log(`
⚠️  以下操作需要在金山多维表格界面中手动完成:

1️⃣  【建立表间关联字段】
    将以下文本字段改为「关联记录」字段类型:
    
    ┌──────────────────────────────────┬────────────────────┬───────────────────────┐
    │ 表名                             │ 字段名              │ 关联目标表             │
    ├──────────────────────────────────┼────────────────────┼───────────────────────┤
    │ 项目本地化部署升级信息表           │ 项目名称            │ → 项目基本信息表       │
    │ 项目本地化部署状态表               │ 关联项目            │ → 项目基本信息表       │
    │ 项目本地化部署状态表               │ 关联升级记录         │ → 升级信息表           │
    │ 项目部署环境信息表                 │ 所属部署            │ → 部署状态表           │
    │ 项目部署网络信息表                 │ 所属部署            │ → 部署状态表           │
    │ 项目部署中间件信息表               │ 所属部署            │ → 部署状态表           │
    │ 项目部署业务信息表                 │ 所属部署            │ → 部署状态表           │
    └──────────────────────────────────┴────────────────────┴───────────────────────┘

2️⃣  【配置视图】
    在「项目本地化部署状态表」上创建以下视图:
    - 甘特视图: 开始=计划开始时间, 结束=计划结束时间, 分组=部署状态
    - 日历视图: 日期字段=计划开始时间
    - 看板视图: 按「部署状态」字段分列
    - 表单视图: 作为行业组提交部署需求的入口

3️⃣  【配置权限】
    - 行业组人员: 仅可通过表单提交，只读查看部署状态表
    - 交付部署特战队: 读写核心表及所有子表
    - 小组长: 全部读写 + 仪表盘编辑

4️⃣  【配置自动化规则】
    - 新建项目信息 → 自动创建部署状态记录 (状态=待排期)
    - 新建升级信息 → 自动创建部署状态记录 (来源=升级)
    - 部署状态→部署中: 自动记录实际开始时间
    - 部署状态→已完成: 自动记录实际结束时间
    - 部署状态→部署异常: 发送通知给小组长

5️⃣  【将「部署负责人」改为成员字段】
    在「部署状态表」中将「部署负责人」字段类型改为 Member (成员)

6️⃣  【创建仪表盘】
    - 部署状态分布饼图
    - 本月部署任务数柱状图
    - 各状态任务数统计卡片
  `);

  console.log("✅ 脚本执行完成!");
  return report;
}

// ============================================================
//  执行入口
// ============================================================

main()
  .then((report) => {
    process.exit(report.failed.length > 0 ? 1 : 0);
  })
  .catch((err) => {
    console.error("\n💥 脚本执行发生未捕获错误:", err);
    process.exit(1);
  });
