import { resolveChannelDefaultAccountId } from "../../channels/plugins/helpers.js";
import { getChannelPlugin, listChannelPlugins, normalizeChannelId, } from "../../channels/plugins/index.js";
import { writeConfigFile } from "../../config/config.js";
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../routing/session-key.js";
import { defaultRuntime } from "../../runtime.js";
import { createClackPrompter } from "../../wizard/clack-prompter.js";
import { channelLabel, requireValidConfig, shouldUseWizard } from "./shared.js";
function listAccountIds(cfg, channel) {
    const plugin = getChannelPlugin(channel);
    if (!plugin)
        return [];
    return plugin.config.listAccountIds(cfg);
}
export async function channelsRemoveCommand(opts, runtime = defaultRuntime, params) {
    const cfg = await requireValidConfig(runtime);
    if (!cfg)
        return;
    const useWizard = shouldUseWizard(params);
    const prompter = useWizard ? createClackPrompter() : null;
    let channel = normalizeChannelId(opts.channel);
    let accountId = normalizeAccountId(opts.account);
    const deleteConfig = Boolean(opts.delete);
    if (useWizard && prompter) {
        await prompter.intro("移除通道账户");
        const selectedChannel = (await prompter.select({
            message: "通道",
            options: listChannelPlugins().map((plugin) => ({
                value: plugin.id,
                label: plugin.meta.label,
            })),
        }));
        channel = selectedChannel;
        accountId = await (async () => {
            const ids = listAccountIds(cfg, selectedChannel);
            const choice = (await prompter.select({
                message: "账户",
                options: ids.map((id) => ({
                    value: id,
                    label: id === DEFAULT_ACCOUNT_ID ? "default (primary)" : id,
                })),
                initialValue: ids[0] ?? DEFAULT_ACCOUNT_ID,
            }));
            return normalizeAccountId(choice);
        })();
        const wantsDisable = await prompter.confirm({
            message: `禁用 ${channelLabel(selectedChannel)} 账户 "${accountId}"？（保留配置）`,
            initialValue: true,
        });
        if (!wantsDisable) {
            await prompter.outro("Cancelled.");
            return;
        }
    }
    else {
        if (!channel) {
            runtime.error("Channel is required. Use --channel <name>.");
            runtime.exit(1);
            return;
        }
        if (!deleteConfig) {
            const confirm = createClackPrompter();
            const ok = await confirm.confirm({
                message: `Disable ${channelLabel(channel)} account "${accountId}"? (keeps config)`,
                initialValue: true,
            });
            if (!ok) {
                return;
            }
        }
    }
    const plugin = getChannelPlugin(channel);
    if (!plugin) {
        runtime.error(`Unknown channel: ${channel}`);
        runtime.exit(1);
        return;
    }
    const resolvedAccountId = normalizeAccountId(accountId) ?? resolveChannelDefaultAccountId({ plugin, cfg });
    const accountKey = resolvedAccountId || DEFAULT_ACCOUNT_ID;
    let next = { ...cfg };
    if (deleteConfig) {
        if (!plugin.config.deleteAccount) {
            runtime.error(`Channel ${channel} does not support delete.`);
            runtime.exit(1);
            return;
        }
        next = plugin.config.deleteAccount({
            cfg: next,
            accountId: resolvedAccountId,
        });
    }
    else {
        if (!plugin.config.setAccountEnabled) {
            runtime.error(`Channel ${channel} does not support disable.`);
            runtime.exit(1);
            return;
        }
        next = plugin.config.setAccountEnabled({
            cfg: next,
            accountId: resolvedAccountId,
            enabled: false,
        });
    }
    await writeConfigFile(next);
    if (useWizard && prompter) {
        await prompter.outro(deleteConfig
            ? `已删除 ${channelLabel(channel)} 账户 "${accountKey}"。`
            : `已禁用 ${channelLabel(channel)} 账户 "${accountKey}"。`);
    }
    else {
        runtime.log(deleteConfig
            ? `已删除 ${channelLabel(channel)} 账户 "${accountKey}"。`
            : `已禁用 ${channelLabel(channel)} 账户 "${accountKey}"。`);
    }
}
