/**
 * 渠道配置（双轨制：渠道 → Beancount 账户映射）。
 *
 * 渠道是支付平台标识（Alipay/WeChat/Bank），账户是 Beancount 科目（Assets:支付宝余额）。
 * 导入时通过渠道配置将渠道映射到正确的账户，而非硬编码。
 *
 * 设计见 plan.md「决策 1 双轨制」。
 */

import { CHANNEL_BRAND_COLORS } from '../../theme/palette';

export interface ChannelConfig {
  id: string;
  /** 渠道名（与 ImportedEvent.channel 对齐，如 "Alipay", "WeChat", "Bank"）。 */
  name: string;
  /** 默认渠道账户（Beancount 科目，如 "Assets:支付宝余额"）。 */
  defaultAccount: string;
  /** Android 包名（用于自动识别，如 "com.eg.android.AlipayGphone"）。 */
  packageNames?: string[];
  /** UI 图标（可选）。 */
  icon?: string;
  /** UI 颜色（可选）。 */
  color?: string;
}

/** 内置渠道默认配置（不可删除，用户可修改 defaultAccount）。 */
export const BUILTIN_CHANNELS: ChannelConfig[] = [
  {
    id: 'ch_alipay',
    name: 'Alipay',
    defaultAccount: 'Assets:支付宝余额',
    packageNames: ['com.eg.android.AlipayGphone', 'com.eg.android.AlipayGphone.wallet'],
    icon: 'alipay',
    color: CHANNEL_BRAND_COLORS.alipay,
  },
  {
    id: 'ch_wechat',
    name: 'WeChat',
    defaultAccount: 'Assets:微信零钱',
    packageNames: ['com.tencent.mm', 'com.tencent.mobileqq'],
    icon: 'wechat',
    color: CHANNEL_BRAND_COLORS.wechat,
  },
  {
    id: 'ch_bank',
    name: 'Bank',
    defaultAccount: 'Assets:银行卡',
    packageNames: [
      'com.unionpay',
      'com.cmbchina',
      'com.cmbchina.ccd.pluto.cmbActivity',
      'com.icbc',
      'com.chinamworld.main',
      'com.ccb.longjiLife',
      'com.cib.cibmb',
      'com.bankcomm.Bankcomm',
    ],
    icon: 'bank',
    color: CHANNEL_BRAND_COLORS.bank,
  },
];

/**
 * 从包名反查渠道配置。
 * 优先查用户配置，再查内置配置。
 */
export function resolveChannelByPackage(
  packageName: string,
  channels: ChannelConfig[],
): ChannelConfig | undefined {
  // 先查用户自定义渠道
  for (const ch of channels) {
    if (ch.packageNames?.includes(packageName)) return ch;
  }
  // 再查内置渠道
  for (const ch of BUILTIN_CHANNELS) {
    if (ch.packageNames?.includes(packageName)) return ch;
  }
  return undefined;
}

/**
 * 从渠道名查找渠道配置。
 * 优先查用户配置，再查内置配置。
 */
export function resolveChannelByName(
  name: string,
  channels: ChannelConfig[],
): ChannelConfig | undefined {
  const lower = name.toLowerCase();
  const match = (ch: ChannelConfig) => ch.name.toLowerCase() === lower;
  return channels.find(match) ?? BUILTIN_CHANNELS.find(match);
}
