/**
 * 项目 ID 生成模块
 * 为每个项目生成稳定的唯一标识符
 */

import * as crypto from 'crypto';
import { exec } from 'child_process';
import { promisify } from 'util';

const execAsync = promisify(exec);

/**
 * 获取项目 ID
 * 优先使用 Git 初始 commit hash，降级为路径 hash
 */
export async function getProjectId(workdir: string): Promise<string> {
  // 1. 尝试获取 Git 初始 commit hash
  const gitId = await getGitRootCommit(workdir);
  if (gitId) {
    return gitId;
  }

  // 2. 降级为路径 hash (取前 16 位)
  return crypto.createHash('sha256').update(workdir).digest('hex').slice(0, 16);
}

/**
 * 获取 Git 仓库的初始 commit hash
 * 这个值在整个仓库生命周期内保持稳定
 */
async function getGitRootCommit(workdir: string): Promise<string | null> {
  try {
    // 获取所有根 commit（没有父 commit 的 commit）
    // 对于大多数仓库只有一个，但 merge 仓库可能有多个
    const { stdout } = await execAsync('git rev-list --max-parents=0 --all', {
      cwd: workdir,
      timeout: 5000,
    });

    const commits = stdout
      .split('\n')
      .map((line) => line.trim())
      .filter(Boolean)
      .sort(); // 排序确保多根 commit 时结果稳定

    if (commits.length > 0) {
      // 取第一个（字典序最小的）commit hash 的前 16 位
      return commits[0].slice(0, 16);
    }

    return null;
  } catch {
    // 不是 Git 仓库或其他错误
    return null;
  }
}

/**
 * 检查目录是否是 Git 仓库
 */
export async function isGitRepository(workdir: string): Promise<boolean> {
  try {
    await execAsync('git rev-parse --git-dir', {
      cwd: workdir,
      timeout: 3000,
    });
    return true;
  } catch {
    return false;
  }
}
