import { readConfigFileSnapshot } from "../../config/config.js";
import { loadAndMaybeMigrateDoctorConfig } from "../../commands/doctor-config-flow.js";
import { colorize, isRich, theme } from "../../terminal/theme.js";
import { formatCliCommand } from "../command-format.js";
import { shortenHomePath } from "../../utils.js";
const ALLOWED_INVALID_COMMANDS = new Set(["doctor", "logs", "health", "help", "status"]);
const ALLOWED_INVALID_GATEWAY_SUBCOMMANDS = new Set([
    "status",
    "probe",
    "health",
    "discover",
    "call",
    "install",
    "uninstall",
    "start",
    "stop",
    "restart",
]);
let didRunDoctorConfigFlow = false;
function formatConfigIssues(issues) {
    return issues.map((issue) => `- ${issue.path || "<root>"}: ${issue.message}`);
}
export async function ensureConfigReady(params) {
    if (!didRunDoctorConfigFlow) {
        didRunDoctorConfigFlow = true;
        await loadAndMaybeMigrateDoctorConfig({
            options: { nonInteractive: true },
            confirm: async () => false,
        });
    }
    const snapshot = await readConfigFileSnapshot();
    const commandName = params.commandPath?.[0];
    const subcommandName = params.commandPath?.[1];
    const allowInvalid = commandName
        ? ALLOWED_INVALID_COMMANDS.has(commandName) ||
            (commandName === "gateway" &&
                subcommandName &&
                ALLOWED_INVALID_GATEWAY_SUBCOMMANDS.has(subcommandName))
        : false;
    const issues = snapshot.exists && !snapshot.valid ? formatConfigIssues(snapshot.issues) : [];
    const legacyIssues = snapshot.legacyIssues.length > 0
        ? snapshot.legacyIssues.map((issue) => `- ${issue.path}: ${issue.message}`)
        : [];
    const invalid = snapshot.exists && !snapshot.valid;
    if (!invalid)
        return;
    const rich = isRich();
    const muted = (value) => colorize(rich, theme.muted, value);
    const error = (value) => colorize(rich, theme.error, value);
    const heading = (value) => colorize(rich, theme.heading, value);
    const commandText = (value) => colorize(rich, theme.command, value);
    params.runtime.error(heading("Config invalid"));
    params.runtime.error(`${muted("File:")} ${muted(shortenHomePath(snapshot.path))}`);
    if (issues.length > 0) {
        params.runtime.error(muted("Problem:"));
        params.runtime.error(issues.map((issue) => `  ${error(issue)}`).join("\n"));
    }
    if (legacyIssues.length > 0) {
        params.runtime.error(muted("Legacy config keys detected:"));
        params.runtime.error(legacyIssues.map((issue) => `  ${error(issue)}`).join("\n"));
    }
    params.runtime.error("");
    params.runtime.error(`${muted("Run:")} ${commandText(formatCliCommand("openclaw-cn doctor --fix"))}`);
    if (!allowInvalid) {
        params.runtime.exit(1);
    }
}
