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

const REF_PREFIX = ".windsurf/rules/designpaca";

/** Windsurf 규칙 파일의 하드 상한. 넘으면 잘려서 조용히 망가진다. */
const WINDSURF_CHAR_LIMIT = 12_000;

/**
 * Windsurf — .windsurf/rules/designpaca.md.
 * Cursor 와 경로·프론트매터가 모두 다르다(trigger/globs, .mdc 아님).
 *
 * trigger 는 model_decision 을 쓴다. always_on 으로 두면 디자인 스킬이 모든 메시지의
 * 시스템 프롬프트에 상주한다.
 */
export const windsurf: TargetAdapter = {
  id: "windsurf",
  label: "Windsurf",
  hint: ".windsurf/rules/designpaca.md — 프로젝트 단위",
  scopes: ["project"],

  async detect(ctx: TargetContext) {
    return anyExists([
      path.join(ctx.cwd, ".windsurf"),
      path.join(ctx.cwd, ".windsurfrules"),
      path.join(ctx.home, ".windsurf"),
    ]);
  },

  async plan(ctx: TargetContext) {
    const rulesDir = path.join(ctx.cwd, ".windsurf", "rules");
    const rule = path.join(rulesDir, "designpaca.md");
    const refRoot = path.join(rulesDir, "designpaca");

    const header = [
      "---",
      "trigger: model_decision",
      `description: ${ctx.skill.description}`,
      "---",
      "",
    ].join("\n");

    const body = header + rewriteRefPaths(ctx.skill.body, REF_PREFIX);

    const actions: FileAction[] = [
      { kind: "write", path: rule, content: body },
      ...referenceActions(refRoot, ctx.skill),
    ];

    return {
      target: this.id,
      scope: ctx.scope,
      root: rulesDir,
      actions,
      alreadyInstalled: await exists(rule),
      // 상한을 넘으면 설치는 되지만 Windsurf 가 뒷부분을 버린다. 조용히 깨지느니 막는다.
      ...(body.length > WINDSURF_CHAR_LIMIT
        ? {
            blocked: `규칙 본문이 ${body.length}자로 Windsurf 상한(${WINDSURF_CHAR_LIMIT}자)을 넘는다. SKILL.md 를 줄여야 한다.`,
          }
        : {}),
    };
  },
};
