import { danger } from "../globals.js";
import { defaultRuntime } from "../runtime.js";
import { formatDocsLink } from "../terminal/links.js";
import { theme } from "../terminal/theme.js";
import { addGatewayClientOptions, callGatewayFromCli } from "./gateway-rpc.js";
const normalizeWakeMode = (raw) => {
    const mode = typeof raw === "string" ? raw.trim() : "";
    if (!mode)
        return "next-heartbeat";
    if (mode === "now" || mode === "next-heartbeat")
        return mode;
    throw new Error("--mode must be now or next-heartbeat");
};
export function registerSystemCli(program) {
    const system = program
        .command("system")
        .description("系统工具（事件、心跳、在线状态）")
        .addHelpText("after", () => `\n${theme.muted("Docs:")} ${formatDocsLink("/cli/system", "docs.clawd.bot/cli/system")}\n`);
    addGatewayClientOptions(system
        .command("event")
        .description("Enqueue a system event and optionally trigger a heartbeat")
        .requiredOption("--text <text>", "System event text")
        .option("--mode <mode>", "Wake mode (now|next-heartbeat)", "next-heartbeat")
        .option("--json", "Output JSON", false)).action(async (opts) => {
        try {
            const text = typeof opts.text === "string" ? opts.text.trim() : "";
            if (!text)
                throw new Error("--text is required");
            const mode = normalizeWakeMode(opts.mode);
            const result = await callGatewayFromCli("wake", opts, { mode, text }, { expectFinal: false });
            if (opts.json)
                defaultRuntime.log(JSON.stringify(result, null, 2));
            else
                defaultRuntime.log("ok");
        }
        catch (err) {
            defaultRuntime.error(danger(String(err)));
            defaultRuntime.exit(1);
        }
    });
    const heartbeat = system.command("heartbeat").description("Heartbeat controls");
    addGatewayClientOptions(heartbeat
        .command("last")
        .description("Show the last heartbeat event")
        .option("--json", "Output JSON", false)).action(async (opts) => {
        try {
            const result = await callGatewayFromCli("last-heartbeat", opts, undefined, {
                expectFinal: false,
            });
            defaultRuntime.log(JSON.stringify(result, null, 2));
        }
        catch (err) {
            defaultRuntime.error(danger(String(err)));
            defaultRuntime.exit(1);
        }
    });
    addGatewayClientOptions(heartbeat
        .command("enable")
        .description("Enable heartbeats")
        .option("--json", "Output JSON", false)).action(async (opts) => {
        try {
            const result = await callGatewayFromCli("set-heartbeats", opts, { enabled: true }, { expectFinal: false });
            defaultRuntime.log(JSON.stringify(result, null, 2));
        }
        catch (err) {
            defaultRuntime.error(danger(String(err)));
            defaultRuntime.exit(1);
        }
    });
    addGatewayClientOptions(heartbeat
        .command("disable")
        .description("Disable heartbeats")
        .option("--json", "Output JSON", false)).action(async (opts) => {
        try {
            const result = await callGatewayFromCli("set-heartbeats", opts, { enabled: false }, { expectFinal: false });
            defaultRuntime.log(JSON.stringify(result, null, 2));
        }
        catch (err) {
            defaultRuntime.error(danger(String(err)));
            defaultRuntime.exit(1);
        }
    });
    addGatewayClientOptions(system
        .command("presence")
        .description("List system presence entries")
        .option("--json", "Output JSON", false)).action(async (opts) => {
        try {
            const result = await callGatewayFromCli("system-presence", opts, undefined, {
                expectFinal: false,
            });
            defaultRuntime.log(JSON.stringify(result, null, 2));
        }
        catch (err) {
            defaultRuntime.error(danger(String(err)));
            defaultRuntime.exit(1);
        }
    });
}
