import { existsSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";

export default function devflowDesign(pi: ExtensionAPI) {
  const { z } = pi.zod;
  pi.registerTool({
    name: "devflow_design_rule",
    label: "Devflow Design Rule Pack",
    description: "Install the versioned Devflow design rule pack into the current project.",
    parameters: z.object({ args: z.array(z.string()).default([]) }),
    approval: "write",
    async execute(_id, params, _signal, _onUpdate, ctx) {
      const moduleDirectory = path.dirname(fileURLToPath(import.meta.url));
      const roots = [
        process.env.DEVFLOW_KIT_ROOT,
        path.join(ctx.cwd, ".skills"),
        path.resolve(moduleDirectory, "../skills"),
        path.resolve(moduleDirectory, "../../.."),
      ].filter(Boolean) as string[];
      const skillRoot = roots.find(root =>
        existsSync(path.join(root, "workflow-design-rule-pack/scripts/install.py")),
      );
      if (!skillRoot) throw new Error("Devflow design skills not found");
      const script = path.join(skillRoot, "workflow-design-rule-pack/scripts/install.py");
      const child = Bun.spawn(["python3", script, ...params.args], {
        cwd: ctx.cwd,
        stdout: "pipe",
        stderr: "pipe",
      });
      const [exitCode, stdout, stderr] = await Promise.all([
        child.exited,
        new Response(child.stdout).text(),
        new Response(child.stderr).text(),
      ]);
      const out = stdout.trim();
      const err = stderr.trim();
      return {
        content: [{ type: "text" as const, text: out || err || `Process exited with ${exitCode}` }],
        details: { exitCode, stderr: err || undefined },
        isError: exitCode !== 0,
      };
    },
  });
}
