import path from "node:path";
import { exists } from "../fsx.ts";
import type { FileAction, SkillSource, TargetContext } from "../types.ts";

/** 매니페스트·마커에 쓰는 고정 식별자 */
export const MARKER = "designpaca";

/** 스킬 디렉터리를 통째로 쓰는 타깃(Claude Code·Codex)이 공유하는 파일 목록 */
export function skillDirActions(root: string, skill: SkillSource): FileAction[] {
  const actions: FileAction[] = [
    { kind: "write", path: path.join(root, "SKILL.md"), content: skill.skillMd },
  ];
  for (const [rel, content] of skill.files) {
    actions.push({ kind: "write", path: path.join(root, ...rel.split("/")), content });
  }
  // 업그레이드 판정에 쓰는 버전 스탬프
  actions.push({
    kind: "write",
    path: path.join(root, ".designpaca_version"),
    content: `${skill.version}\n`,
  });
  return actions;
}

/** references 를 별도 디렉터리로 내보내는 타깃(Cursor·AGENTS.md)용 */
export function referenceActions(root: string, skill: SkillSource): FileAction[] {
  const actions: FileAction[] = [];
  for (const [rel, content] of skill.files) {
    actions.push({ kind: "write", path: path.join(root, ...rel.split("/")), content });
  }
  actions.push({
    kind: "write",
    path: path.join(root, ".designpaca_version"),
    content: `${skill.version}\n`,
  });
  return actions;
}

/**
 * 본문의 `references/...` 상대 경로를 실제 설치 위치로 바꾼다.
 *
 * Claude Code·Codex 는 스킬 디렉터리를 통째로 복사하므로 상대 경로가 그대로 맞다.
 * Cursor·Windsurf·AGENTS.md 는 본문만 다른 자리로 옮기고 references 는 별도 디렉터리에 풀기
 * 때문에, 재작성하지 않으면 본문이 가리키는 경로가 전부 존재하지 않는 곳을 가리킨다.
 */
export function rewriteRefPaths(body: string, prefix: string): string {
  return body.replaceAll("references/", `${prefix}/references/`);
}

/** 어느 한 경로라도 있으면 그 도구가 설치돼 있다고 본다 */
export async function anyExists(paths: string[]): Promise<boolean> {
  for (const p of paths) if (await exists(p)) return true;
  return false;
}

export function scopeRoot(ctx: TargetContext, userRel: string[], projectRel: string[]): string {
  return ctx.scope === "user"
    ? path.join(ctx.home, ...userRel)
    : path.join(ctx.cwd, ...projectRel);
}
