import path from "node:path";
import { evaluateRequirementsFromMetadata } from "../shared/requirements.js";
import { CONFIG_DIR } from "../utils.js";
import { hasBinary, isConfigPathTruthy, resolveHookConfig } from "./config.js";
import { loadWorkspaceHookEntries } from "./workspace.js";
function resolveHookKey(entry) {
    return entry.metadata?.hookKey ?? entry.hook.name;
}
function normalizeInstallOptions(entry) {
    const install = entry.metadata?.install ?? [];
    if (install.length === 0) {
        return [];
    }
    // For hooks, we just list all install options
    return install.map((spec, index) => {
        const id = (spec.id ?? `${spec.kind}-${index}`).trim();
        const bins = spec.bins ?? [];
        let label = (spec.label ?? "").trim();
        if (!label) {
            if (spec.kind === "bundled") {
                label = "Bundled with OpenClaw";
            }
            else if (spec.kind === "npm" && spec.package) {
                label = `Install ${spec.package} (npm)`;
            }
            else if (spec.kind === "git" && spec.repository) {
                label = `Install from ${spec.repository}`;
            }
            else {
                label = "Run installer";
            }
        }
        return { id, kind: spec.kind, label, bins };
    });
}
function buildHookStatus(entry, config, eligibility) {
    const hookKey = resolveHookKey(entry);
    const hookConfig = resolveHookConfig(config, hookKey);
    const managedByPlugin = entry.hook.source === "openclaw-plugin";
    const disabled = managedByPlugin ? false : hookConfig?.enabled === false;
    const always = entry.metadata?.always === true;
    const emoji = entry.metadata?.emoji ?? entry.frontmatter.emoji;
    const homepageRaw = entry.metadata?.homepage ??
        entry.frontmatter.homepage ??
        entry.frontmatter.website ??
        entry.frontmatter.url;
    const homepage = homepageRaw?.trim() ? homepageRaw.trim() : undefined;
    const events = entry.metadata?.events ?? [];
    const { required, missing, eligible: requirementsSatisfied, configChecks, } = evaluateRequirementsFromMetadata({
        always,
        metadata: entry.metadata,
        hasLocalBin: hasBinary,
        hasRemoteBin: eligibility?.remote?.hasBin,
        hasRemoteAnyBin: eligibility?.remote?.hasAnyBin,
        localPlatform: process.platform,
        remotePlatforms: eligibility?.remote?.platforms,
        isEnvSatisfied: (envName) => Boolean(process.env[envName] || hookConfig?.env?.[envName]),
        isConfigSatisfied: (pathStr) => isConfigPathTruthy(config, pathStr),
    });
    const eligible = !disabled && requirementsSatisfied;
    return {
        name: entry.hook.name,
        description: entry.hook.description,
        source: entry.hook.source,
        pluginId: entry.hook.pluginId,
        filePath: entry.hook.filePath,
        baseDir: entry.hook.baseDir,
        handlerPath: entry.hook.handlerPath,
        hookKey,
        emoji,
        homepage,
        events,
        always,
        disabled,
        eligible,
        managedByPlugin,
        requirements: required,
        missing,
        configChecks,
        install: normalizeInstallOptions(entry),
    };
}
export function buildWorkspaceHookStatus(workspaceDir, opts) {
    const managedHooksDir = opts?.managedHooksDir ?? path.join(CONFIG_DIR, "hooks");
    const hookEntries = opts?.entries ?? loadWorkspaceHookEntries(workspaceDir, opts);
    return {
        workspaceDir,
        managedHooksDir,
        hooks: hookEntries.map((entry) => buildHookStatus(entry, opts?.config, opts?.eligibility)),
    };
}
