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 devflowQuality(pi: ExtensionAPI) {
  const { z } = pi.zod;
  pi.registerTool({
    name: "devflow_mainflow",
    label: "Devflow Mainflow Cases",
    description: "Run an allowlisted main-flow discovery, compile, or validation operation.",
    parameters: z.object({
      action: z.enum(["discover", "compile", "validate"]),
      args: z.array(z.string()).default([]),
    }),
    approval: "exec",
    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-generate-mainflow-cases/scripts")),
      );
      if (!skillRoot) throw new Error("Devflow quality skills not found");
      const scripts = {
        discover: "discover_codebases.py",
        compile: "compile_dsl.py",
        validate: "validate_case_payloads.py",
      } as const;
      const script = path.join(
        skillRoot,
        "workflow-generate-mainflow-cases/scripts",
        scripts[params.action],
      );
      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: { action: params.action, exitCode, stderr: err || undefined },
        isError: exitCode !== 0,
      };
    },
  });
}
