#!/usr/bin/env node

/**
 * Lint-staged 类型检查脚本
 * 只对修改的文件所在的包运行 typecheck
 */

const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');

// 获取命令行传入的文件列表
const files = process.argv.slice(2);

if (!files || files.length === 0) {
  process.exit(0);
}

// 获取项目根目录（假设脚本在 .husky 目录下）
const projectRoot = path.resolve(__dirname, '..');

// 找出包含修改文件的包目录
const packagesToCheck = new Set();

for (const file of files) {
  // 转换为绝对路径
  const absolutePath = path.resolve(projectRoot, file);

  // 解析文件路径，找到包含 package.json 的目录
  let currentDir = path.dirname(absolutePath);

  while (currentDir !== projectRoot && currentDir !== '/' && path.dirname(currentDir) !== currentDir) {
    const pkgJsonPath = path.join(currentDir, 'package.json');

    if (fs.existsSync(pkgJsonPath)) {
      try {
        const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8'));
        // 检查是否有 typecheck 脚本
        if (pkgJson.scripts && pkgJson.scripts.typecheck) {
          packagesToCheck.add(currentDir);
          break;
        }
      } catch (_e) {
        // 忽略解析错误
      }
    }
    currentDir = path.dirname(currentDir);
  }
}

if (packagesToCheck.size === 0) {
  process.exit(0);
}

// 对每个包运行 typecheck
const failedPackages = [];
for (const pkgDir of packagesToCheck) {
  try {
    execSync('pnpm run typecheck', {
      cwd: pkgDir,
      stdio: 'inherit',
      timeout: 60000
    });
  } catch (_error) {
    failedPackages.push(pkgDir);
  }
}

if (failedPackages.length > 0) {
  process.exit(1);
}
