/**
 * ============================================================
 * 金山多维表格 API 客户端
 * ============================================================
 * 
 * 封装了与 WPS 开放平台多维表格 API 交互的核心方法：
 * - 获取 access_token
 * - 创建工作表 (Sheet)
 * - 创建字段 (Field)
 * - 插入记录 (Record)
 * 
 * 依赖: node-fetch (或 Node.js 18+ 内置 fetch)
 */

const CONFIG = require("./config");

// ============================
//  工具函数
// ============================

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

function log(msg) {
  if (CONFIG.VERBOSE_LOG) {
    console.log(`[${new Date().toISOString()}] ${msg}`);
  }
}

function logError(msg, err) {
  console.error(`[${new Date().toISOString()}] ❌ ${msg}`, err?.message || err);
}

// ============================
//  Token 管理
// ============================

let cachedToken = null;
let tokenExpiry = 0;

/**
 * 获取 access_token (自建应用获取租户的 access_token)
 * POST https://openapi.wps.cn/oauth2/token
 * Content-Type: application/x-www-form-urlencoded
 * Body: grant_type=client_credentials&client_id=xxx&client_secret=xxx
 */
async function getAccessToken() {
  if (cachedToken && Date.now() < tokenExpiry) {
    return cachedToken;
  }

  log("正在获取 access_token...");

  const body = new URLSearchParams({
    grant_type: "client_credentials",
    client_id: CONFIG.APP_ID,
    client_secret: CONFIG.APP_SECRET,
  });

  const resp = await fetch(CONFIG.TOKEN_URL, {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
    },
    body: body.toString(),
  });

  if (!resp.ok) {
    const text = await resp.text();
    throw new Error(`获取 token 失败: ${resp.status} ${text}`);
  }

  const data = await resp.json();
  cachedToken = data.access_token;
  // 提前 5 分钟刷新
  tokenExpiry = Date.now() + (data.expires_in - 300) * 1000;

  log(`access_token 获取成功，有效期 ${data.expires_in} 秒`);
  return cachedToken;
}

// ============================
//  通用请求方法
// ============================

/**
 * 构建请求头 (KSO-1 签名方式)
 * 注意：使用 access_token Bearer 认证
 */
async function buildHeaders() {
  const token = await getAccessToken();
  return {
    "Content-Type": "application/json",
    Authorization: `Bearer ${token}`,
  };
}

/**
 * 发送 API 请求
 */
async function apiRequest(method, path, body = null) {
  const url = `${CONFIG.BASE_URL}${CONFIG.API_PREFIX}/${CONFIG.FILE_ID}${path}`;
  const headers = await buildHeaders();

  const options = {
    method,
    headers,
  };

  if (body) {
    options.body = JSON.stringify(body);
  }

  log(`${method} ${url}`);

  const resp = await fetch(url, options);

  if (!resp.ok) {
    const text = await resp.text();
    throw new Error(`API 请求失败: ${resp.status} ${text}`);
  }

  const data = await resp.json();

  if (data.code && data.code !== 0) {
    throw new Error(`API 返回错误: code=${data.code}, msg=${data.msg}`);
  }

  return data;
}

// ============================
//  工作表 (Sheet) 操作
// ============================

/**
 * 创建工作表
 * POST /v7/coop/dbsheet/{file_id}/sheets/create
 * 
 * @param {string} name - 工作表名称
 * @returns {object} - 返回包含 sheet_id 的响应
 */
async function createSheet(name) {
  log(`📋 创建工作表: ${name}`);

  const result = await apiRequest("POST", "/sheets/create", { name });

  const sheetId = result?.data?.sheet_id || result?.sheet_id;
  log(`✅ 工作表 "${name}" 创建成功, sheet_id = ${sheetId}`);

  await sleep(CONFIG.API_DELAY_MS);
  return result;
}

/**
 * 获取文档 Schema (获取所有工作表及其字段信息)
 * GET /v7/coop/dbsheet/{file_id}/schemas
 */
async function getSchemas() {
  log("📄 获取文档 Schema...");
  return await apiRequest("GET", "/schemas");
}

// ============================
//  字段 (Field) 操作
// ============================

/**
 * 创建字段
 * POST /v7/coop/dbsheet/{file_id}/sheets/{sheet_id}/fields
 * 
 * @param {string} sheetId - 工作表 ID
 * @param {object} fieldDef - 字段定义 { name, type, data? }
 * @returns {object}
 * 
 * 字段定义格式:
 * {
 *   "name": "字段名称",
 *   "type": "SingleSelect",    // 字段类型
 *   "data": {                  // 字段特有属性 (可选)
 *     "options": [{"name": "选项1", "color_index": 1}]
 *   }
 * }
 */
async function createField(sheetId, fieldDef) {
  log(`  📎 创建字段: ${fieldDef.name} (${fieldDef.type})`);

  const result = await apiRequest(
    "POST",
    `/sheets/${sheetId}/fields`,
    { fields: [fieldDef] }
  );

  await sleep(CONFIG.API_DELAY_MS);
  return result;
}

/**
 * 批量创建字段
 * @param {string} sheetId - 工作表 ID
 * @param {Array} fieldDefs - 字段定义数组
 */
async function createFields(sheetId, fieldDefs) {
  const results = [];
  for (const fieldDef of fieldDefs) {
    try {
      const result = await createField(sheetId, fieldDef);
      results.push({ success: true, field: fieldDef.name, result });
    } catch (err) {
      logError(`创建字段 "${fieldDef.name}" 失败`, err);
      results.push({ success: false, field: fieldDef.name, error: err.message });
    }
  }
  return results;
}

// ============================
//  记录 (Record) 操作
// ============================

/**
 * 插入记录
 * POST /v7/coop/dbsheet/{file_id}/sheets/{sheet_id}/records
 * 
 * @param {string} sheetId - 工作表 ID
 * @param {Array} records - 记录数组
 */
async function insertRecords(sheetId, records) {
  log(`  📝 插入 ${records.length} 条记录...`);

  const result = await apiRequest(
    "POST",
    `/sheets/${sheetId}/records`,
    { records }
  );

  await sleep(CONFIG.API_DELAY_MS);
  return result;
}

// ============================
//  导出模块
// ============================

module.exports = {
  getAccessToken,
  getSchemas,
  createSheet,
  createField,
  createFields,
  insertRecords,
  sleep,
  log,
  logError,
};
