import { requireActivePluginRegistry } from "../plugins/runtime.js";
// Channel docking: add new core channels here (order + meta + aliases), then
// register the plugin in its extension entrypoint and keep protocol IDs in sync.
export const CHAT_CHANNEL_ORDER = [
    "telegram",
    "whatsapp",
    "discord",
    "googlechat",
    "feishu",
    "dingtalk-connector",
    "wecom",
    "openclaw-weixin",
    "qqbot",
    "slack",
    "signal",
    "imessage",
];
export const CHANNEL_IDS = [...CHAT_CHANNEL_ORDER];
export const DEFAULT_CHAT_CHANNEL = "whatsapp";
const WEBSITE_URL = "https://clawd.bot";
const CHAT_CHANNEL_META = {
    telegram: {
        id: "telegram",
        label: "Telegram",
        selectionLabel: "Telegram (Bot API)",
        detailLabel: "Telegram Bot",
        docsPath: "/channels/telegram",
        docsLabel: "telegram",
        blurb: "最简单的入门方式——使用 @BotFather 注册一个机器人并开始使用。",
        systemImage: "paperplane",
        selectionDocsPrefix: "",
        selectionDocsOmitLabel: true,
        selectionExtras: [WEBSITE_URL],
    },
    whatsapp: {
        id: "whatsapp",
        label: "WhatsApp",
        selectionLabel: "WhatsApp (QR link)",
        detailLabel: "WhatsApp Web",
        docsPath: "/channels/whatsapp",
        docsLabel: "whatsapp",
        blurb: "使用您自己的号码工作；建议使用独立手机 + eSIM。",
        systemImage: "message",
    },
    discord: {
        id: "discord",
        label: "Discord",
        selectionLabel: "Discord (Bot API)",
        detailLabel: "Discord Bot",
        docsPath: "/channels/discord",
        docsLabel: "discord",
        blurb: "目前支持非常好。",
        systemImage: "bubble.left.and.bubble.right",
    },
    googlechat: {
        id: "googlechat",
        label: "Google Chat",
        selectionLabel: "Google Chat (Chat API)",
        detailLabel: "Google Chat",
        docsPath: "/channels/googlechat",
        docsLabel: "googlechat",
        blurb: "带有HTTP webhook的Google Workspace聊天应用。",
        systemImage: "message.badge",
    },
    feishu: {
        id: "feishu",
        label: "飞书",
        selectionLabel: "飞书 (Lark 开放平台)",
        detailLabel: "飞书机器人",
        docsPath: "/channels/feishu",
        docsLabel: "feishu",
        blurb: "飞书/Lark 机器人集成 (WebSocket)。",
        systemImage: "message",
    },
    "dingtalk-connector": {
        id: "dingtalk-connector",
        label: "钉钉",
        selectionLabel: "钉钉 (官方连接器)",
        detailLabel: "钉钉机器人",
        docsPath: "/channels/dingtalk-connector",
        docsLabel: "dingtalk-connector",
        blurb: "钉钉机器人集成，通过官方 dingtalk-connector 接入。",
        systemImage: "message",
    },
    wecom: {
        id: "wecom",
        label: "企业微信",
        selectionLabel: "企业微信 (WeCom)",
        detailLabel: "企业微信机器人",
        docsPath: "/channels/wecom",
        docsLabel: "wecom",
        blurb: "企业微信机器人接入插件。",
        systemImage: "message",
    },
    "openclaw-weixin": {
        id: "openclaw-weixin",
        label: "微信",
        selectionLabel: "微信 (官方插件)",
        detailLabel: "微信机器人",
        docsPath: "/channels/openclaw-weixin",
        docsLabel: "openclaw-weixin",
        blurb: "微信渠道插件（扫码登录），由腾讯官方插件提供。",
        systemImage: "message",
    },
    qqbot: {
        id: "qqbot",
        label: "QQ",
        selectionLabel: "QQ (社区版)",
        detailLabel: "QQ 机器人",
        docsPath: "/channels/qqbot",
        docsLabel: "qqbot",
        blurb: "QQ 频道/群机器人，通过社区版 qqbot 接入。",
        systemImage: "message",
    },
    slack: {
        id: "slack",
        label: "Slack",
        selectionLabel: "Slack (Socket Mode)",
        detailLabel: "Slack Bot",
        docsPath: "/channels/slack",
        docsLabel: "slack",
        blurb: "已支持（Socket模式）。",
        systemImage: "number",
    },
    signal: {
        id: "signal",
        label: "Signal",
        selectionLabel: "Signal (signal-cli)",
        detailLabel: "Signal REST",
        docsPath: "/channels/signal",
        docsLabel: "signal",
        blurb: 'signal-cli链接设备；更多设置（David Reagans说："加入Discord吧。"）。',
        systemImage: "antenna.radiowaves.left.and.right",
    },
    imessage: {
        id: "imessage",
        label: "iMessage",
        selectionLabel: "iMessage (imsg)",
        detailLabel: "iMessage",
        docsPath: "/channels/imessage",
        docsLabel: "imessage",
        blurb: "这仍然是一个正在进行的工作。",
        systemImage: "message.fill",
    },
};
export const CHAT_CHANNEL_ALIASES = {
    imsg: "imessage",
    "google-chat": "googlechat",
    gchat: "googlechat",
    dingtalk: "dingtalk-connector",
    dingding: "dingtalk-connector",
    wxwork: "wecom",
    "wechat-work": "wecom",
    weixin: "openclaw-weixin",
    wechat: "openclaw-weixin",
    qq: "qqbot",
    "qq-bot": "qqbot",
};
const normalizeChannelKey = (raw) => {
    const normalized = raw?.trim().toLowerCase();
    return normalized || undefined;
};
export function listChatChannels() {
    return CHAT_CHANNEL_ORDER.map((id) => CHAT_CHANNEL_META[id]);
}
export function listChatChannelAliases() {
    return Object.keys(CHAT_CHANNEL_ALIASES);
}
export function getChatChannelMeta(id) {
    return CHAT_CHANNEL_META[id];
}
export function normalizeChatChannelId(raw) {
    const normalized = normalizeChannelKey(raw);
    if (!normalized)
        return null;
    const resolved = CHAT_CHANNEL_ALIASES[normalized] ?? normalized;
    return CHAT_CHANNEL_ORDER.includes(resolved)
        ? resolved
        : null;
}
// Channel docking: prefer this helper in shared code. Importing from
// `src/channels/plugins/*` can eagerly load channel implementations.
export function normalizeChannelId(raw) {
    return normalizeChatChannelId(raw);
}
// Normalizes registered channel plugins (bundled or external).
//
// Keep this light: we do not import channel plugins here (those are "heavy" and can pull in
// monitors, web login, etc). The plugin registry must be initialized first.
export function normalizeAnyChannelId(raw) {
    const key = normalizeChannelKey(raw);
    if (!key)
        return null;
    const registry = requireActivePluginRegistry();
    const hit = registry.channels.find((entry) => {
        const id = String(entry.plugin.id ?? "")
            .trim()
            .toLowerCase();
        if (id && id === key)
            return true;
        return (entry.plugin.meta.aliases ?? []).some((alias) => alias.trim().toLowerCase() === key);
    });
    return hit?.plugin.id ?? null;
}
export function formatChannelPrimerLine(meta) {
    return `${meta.label}: ${meta.blurb}`;
}
export function formatChannelSelectionLine(meta, docsLink) {
    const docsPrefix = meta.selectionDocsPrefix ?? "文档:";
    const docsLabel = meta.docsLabel ?? meta.id;
    const docs = meta.selectionDocsOmitLabel
        ? docsLink(meta.docsPath)
        : docsLink(meta.docsPath, docsLabel);
    const extras = (meta.selectionExtras ?? []).filter(Boolean).join(" ");
    return `${meta.label} — ${meta.blurb} ${docsPrefix ? `${docsPrefix} ` : ""}${docs}${extras ? ` ${extras}` : ""}`;
}
