import path from "node:path";
import { exists } from "../fsx.ts";
import type { FileAction, TargetAdapter, TargetContext } from "../types.ts";
import { MARKER, rewriteRefPaths, skillDirActions } from "./common.ts";

/**
 * 범용 AGENTS.md — 어떤 에이전트든 읽는 프로젝트 루트 문서에 우리 블록만 심는다.
 * 문서 전체를 덮어쓰지 않는다. 블록 밖은 사용자 것이다.
 *
 * **본문 전체를 넣지 않는다.** AGENTS.md 는 스킬과 달리 조건 없이 항상 로드되고,
 * Codex 는 병합 결과를 기본 32KiB 에서 자른다. 14KB 짜리 본문을 넣으면
 * 디자인과 무관한 모든 대화에서 그 비용을 내고, 프로젝트 자신의 지침이 잘려나갈 수 있다.
 * 그래서 여기에는 포인터만 두고 본문은 .designpaca/ 에 풀어둔다.
 */
export const agentsMd: TargetAdapter = {
  id: "agents-md",
  label: "범용 AGENTS.md",
  hint: "AGENTS.md 에 포인터 주입 — 에이전트 무관",
  scopes: ["project", "user"],

  async detect(ctx: TargetContext) {
    // 항상 로드되는 자리라 기본 선택은 보수적으로 — AGENTS.md 가 실제로 있을 때만.
    return (
      (await exists(path.join(ctx.cwd, "AGENTS.md"))) ||
      (await exists(path.join(ctx.home, ".codex", "AGENTS.md")))
    );
  },

  async plan(ctx: TargetContext) {
    const isUser = ctx.scope === "user";
    const doc = isUser
      ? path.join(ctx.home, ".codex", "AGENTS.md")
      : path.join(ctx.cwd, "AGENTS.md");
    // user/project 가 같은 구조를 갖도록 둘 다 .designpaca 를 루트로 쓴다
    const refRoot = isUser
      ? path.join(ctx.home, ".designpaca", "skill")
      : path.join(ctx.cwd, ".designpaca");
    const refPrefix = isUser ? "~/.designpaca/skill" : ".designpaca";

    const block = [
      "## designpaca — 웹 디자인 파이프라인",
      "",
      "이 리포에서 UI 를 새로 만들거나 다시 디자인할 때는, 마크업·스타일을 쓰기 전에",
      `\`${refPrefix}/SKILL.md\` 를 읽고 그 파이프라인(0~6단계)을 따른다.`,
      "",
      "- 프로젝트 루트에 `design.md` 가 있으면 그것이 최상위다. 스킬 기본값을 덮는다.",
      "- 참조 문서는 각 단계에서 지시하는 것만 그때 연다. 처음부터 전부 읽지 마라.",
      "",
      `<!-- designpaca v${ctx.skill.version} — \`npx designpaca update\` 가 관리한다. 직접 고치면 업데이트가 멈춘다. -->`,
    ].join("\n");

    // 본문은 별도 디렉터리에 통째로 푼다. 경로 재작성이 필요하다.
    const skillActions = skillDirActions(refRoot, {
      ...ctx.skill,
      skillMd: rewriteRefPaths(ctx.skill.skillMd, refPrefix),
    });

    const actions: FileAction[] = [
      { kind: "inject", path: doc, marker: MARKER, content: block },
      ...skillActions,
    ];

    return {
      target: this.id,
      scope: ctx.scope,
      root: refRoot,
      actions,
      alreadyInstalled: await exists(path.join(refRoot, "SKILL.md")),
    };
  },
};
