import { checkTools } from "@designpaca/core";
import { bad, dim, heading, info, ok, table, warn } from "../ui.ts";

/**
 * 선택 도구의 상태를 보여주고, 없는 것을 설치한다.
 *
 * 온보딩에서 건너뛴 사람과, 나중에 필요해진 사람 모두를 위한 자리다.
 * `--yes` 없이 비대화형으로 부르면 **상태만 보여주고 아무것도 설치하지 않는다** —
 * 도구 설치는 수백 MB 를 받는 일이라 조용히 시작하면 안 된다.
 */
export async function runTools(opts: { install: boolean }): Promise<number> {
  const status = await checkTools();

  console.log(heading("브라우저 도구"));
  console.log(
    table(
      status.map(({ tool, installed }) => [
        tool.label,
        installed ? "설치됨" : dim("설치되지 않음"),
      ]),
    ),
  );

  const missing = status.filter((s) => !s.installed);

  if (missing.length === 0) {
    console.log(ok("필요한 도구가 모두 준비돼 있습니다."));
    return 0;
  }

  console.log();
  for (const { tool } of missing) {
    console.log(`${tool.label} ${dim(`· ${tool.size}`)}`);
    console.log(`  ${dim(tool.why)}`);
  }

  if (!opts.install) {
    console.log();
    console.log(info("설치하시려면 `designpaca tools --yes` 를 실행해 주세요."));
    return 0;
  }

  console.log();
  let failed = 0;
  const followUps: string[] = [];
  for (const { tool } of missing) {
    process.stdout.write(`${tool.label} 설치 중… `);
    try {
      await tool.install();
      console.log("완료");
      if (tool.followUp) followUps.push(tool.followUp);
    } catch (err) {
      failed++;
      console.log("실패");
      const first = err instanceof Error ? (err.message.split("\n")[0] ?? err.message) : String(err);
      console.log(`  ${bad(first)}`);
    }
  }

  if (followUps.length > 0) {
    console.log();
    console.log(warn("아래는 에이전트 설정을 바꾸는 것이라 직접 실행해 주세요."));
    for (const f of followUps) console.log(`  ${f}`);
  }

  return failed > 0 ? 1 : 0;
}
