import { listEnabledDiscordAccounts } from "../../extensions/discord/src/accounts.js";
import { isDiscordExecApprovalClientEnabled } from "../../extensions/discord/src/exec-approvals.js";
import { listEnabledTelegramAccounts } from "../../extensions/telegram/src/accounts.js";
import { isTelegramExecApprovalClientEnabled } from "../../extensions/telegram/src/exec-approvals.js";
import { loadConfig, type OpenClawConfig } from "../config/config.js";
import { INTERNAL_MESSAGE_CHANNEL, normalizeMessageChannel } from "../utils/message-channel.js";

export type ExecApprovalInitiatingSurfaceState =
  | { kind: "enabled"; channel: string | undefined; channelLabel: string }
  | { kind: "disabled"; channel: string; channelLabel: string }
  | { kind: "unsupported"; channel: string; channelLabel: string };

function labelForChannel(channel?: string): string {
  switch (channel) {
    case "discord":
      return "Discord";
    case "telegram":
      return "Telegram";
    case "tui":
      return "terminal UI";
    case INTERNAL_MESSAGE_CHANNEL:
      return "Web UI";
    default:
      return channel ? channel[0]?.toUpperCase() + channel.slice(1) : "this platform";
  }
}

export function resolveExecApprovalInitiatingSurfaceState(params: {
  channel?: string | null;
  accountId?: string | null;
  cfg?: OpenClawConfig;
}): ExecApprovalInitiatingSurfaceState {
  const channel = normalizeMessageChannel(params.channel);
  const channelLabel = labelForChannel(channel);
  if (!channel || channel === INTERNAL_MESSAGE_CHANNEL || channel === "tui") {
    return { kind: "enabled", channel, channelLabel };
  }

  const cfg = params.cfg ?? loadConfig();
  if (channel === "telegram") {
    return isTelegramExecApprovalClientEnabled({ cfg, accountId: params.accountId })
      ? { kind: "enabled", channel, channelLabel }
      : { kind: "disabled", channel, channelLabel };
  }
  if (channel === "discord") {
    return isDiscordExecApprovalClientEnabled({ cfg, accountId: params.accountId })
      ? { kind: "enabled", channel, channelLabel }
      : { kind: "disabled", channel, channelLabel };
  }
  return { kind: "unsupported", channel, channelLabel };
}

function hasExecApprovalDmRoute(
  accounts: Array<{
    config: {
      execApprovals?: {
        enabled?: boolean;
        approvers?: unknown[];
        target?: string;
      };
    };
  }>,
): boolean {
  for (const account of accounts) {
    const execApprovals = account.config.execApprovals;
    if (!execApprovals?.enabled || (execApprovals.approvers?.length ?? 0) === 0) {
      continue;
    }
    const target = execApprovals.target ?? "dm";
    if (target === "dm" || target === "both") {
      return true;
    }
  }
  return false;
}

export function hasConfiguredExecApprovalDmRoute(cfg: OpenClawConfig): boolean {
  return (
    hasExecApprovalDmRoute(listEnabledDiscordAccounts(cfg)) ||
    hasExecApprovalDmRoute(listEnabledTelegramAccounts(cfg))
  );
}
