import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
import { execFile } from "node:child_process";
import { promisify } from "node:util";

const execFileAsync = promisify(execFile);
const SCRIPT = "/root/.openclaw/workspace/scripts/check-openclaw-models.js";

const plugin = {
  id: "check-models",
  name: "Check Models Command",
  description: "Adds /check-models slash command",
  configSchema: emptyPluginConfigSchema(),
  register(api: OpenClawPluginApi) {
    api.registerCommand({
      name: "check-models",
      description: "Run local OpenClaw model health checks",
      acceptsArgs: true,
      requireAuth: true,
      handler: async (ctx) => {
        const rawArgs = (ctx.args || "").trim();
        const wantsRaw = rawArgs.includes("--raw") || rawArgs === "raw";
        const args = wantsRaw ? [SCRIPT, "--raw"] : [SCRIPT];
        try {
          const { stdout, stderr } = await execFileAsync("node", args, {
            timeout: 120000,
            maxBuffer: 2 * 1024 * 1024,
          });
          const text = [stdout?.trim(), stderr?.trim()].filter(Boolean).join("\n");
          return {
            text: text || "check-models: no output",
          };
        } catch (err: any) {
          const stdout = err?.stdout ? String(err.stdout).trim() : "";
          const stderr = err?.stderr ? String(err.stderr).trim() : "";
          const msg = err?.message ? String(err.message) : String(err);
          return {
            text: [
              "check-models failed",
              msg,
              stdout && `stdout:\n${stdout}`,
              stderr && `stderr:\n${stderr}`,
            ].filter(Boolean).join("\n\n"),
          };
        }
      },
    });
  },
};

export default plugin;
