/**
 * 原生浮层 UI 配置下发（docs/ui-redesign-p6-plan.md「FloatingUiConfig 契约」）。
 *
 * 原生 View（悬浮球/悬浮窗/提示）无法直接用 RN theme，
 * 由 JS 侧从当前 theme tokens + i18n 构建 config，
 * 经 AccessibilityBridge.setFloatingUiConfig 推送到原生（存 SharedPreferences），
 * 三个浮层组件读取；原生保留硬编码默认值兜底（JS 未推送时行为不变）。
 */

import type { ThemeTokens } from '../../theme/tokens';
import { getAccessibilityBridge } from './accessibilityBridge';
import { logger } from '../../utils/logger';

/** t 函数签名（与 i18n.t / useT() 返回值兼容）。 */
export type TranslateFn = (key: string, options?: Record<string, unknown>) => string;

/**
 * JS → 原生浮层 UI 配置契约。
 * 字段名（camelCase）与原生 FloatingUiConfig data class 一一对应。
 */
export interface FloatingUiConfig {
  colors: {
    /** 按钮/选中态背景（= theme accent）。 */
    accent: string;
    /** accent 上的文字色（= fgInverse）。 */
    accentFg: string;
    /** 卡片底色（= bgSecondary）。 */
    cardBg: string;
    /** 输入框/未选中 chip 底色（= bgTertiary）。 */
    inputBg: string;
    fgPrimary: string;
    fgSecondary: string;
    border: string;
    /** financial.income */
    income: string;
    /** financial.expense */
    expense: string;
    /** financial.transfer */
    transfer: string;
  };
  labels: {
    /** 浮窗标题。 */
    billTitle: string;
    dirExpense: string;
    dirIncome: string;
    dirTransfer: string;
    amountLabel: string;
    payeeLabel: string;
    narrationLabel: string;
    narrationHint: string;
    /** 「交易分类」 */
    categoryExpense: string;
    /** 「收入分类」 */
    categoryIncome: string;
    /** 「转入账户」 */
    transferTarget: string;
    /** 「资金来源」 */
    accountExpense: string;
    /** 「存入账户」 */
    accountIncome: string;
    /** 「转出账户」 */
    accountTransfer: string;
    openApp: string;
    dismiss: string;
    confirm: string;
    /** 悬浮球「识别账单」 */
    ballOcr: string;
    /** 「记住此页」 */
    ballRemember: string;
    /** 记住页面成功提示（不含 emoji）。 */
    rememberSuccess: string;
    /** 失败提示前缀（原生拼接 ': ' + e.message）。 */
    rememberFail: string;
    /** SelectToSpeakService Toast「已记住页面签名」前缀。 */
    pageRemembered: string;
    /** 「该页面签名已存在」前缀。 */
    pageSignatureExists: string;
  };
}

/**
 * 颜色换算为原生 Color.parseColor 可解析的 hex 字符串：
 * - '#RRGGBB' 原样返回
 * - 'rgba(r,g,b,a)' → '#AARRGGBB'（alpha = Math.round(a*255)，两位大写 hex 补零）
 * - 其它格式原样返回
 */
export function colorToHex(color: string): string {
  const m = color.match(/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)$/);
  if (!m) return color;
  const toHex2 = (n: number) => n.toString(16).toUpperCase().padStart(2, '0');
  const alpha = Math.round(parseFloat(m[4]) * 255);
  return `#${toHex2(alpha)}${toHex2(Number(m[1]))}${toHex2(Number(m[2]))}${toHex2(Number(m[3]))}`;
}

/** 从 theme tokens + t() 构建完整 config。 */
export function buildFloatingUiConfig(theme: ThemeTokens, t: TranslateFn): FloatingUiConfig {
  const c = theme.colors;
  return {
    colors: {
      accent: colorToHex(c.accent),
      accentFg: colorToHex(c.fgInverse),
      cardBg: colorToHex(c.bgSecondary),
      inputBg: colorToHex(c.bgTertiary),
      fgPrimary: colorToHex(c.fgPrimary),
      fgSecondary: colorToHex(c.fgSecondary),
      border: colorToHex(c.border),
      income: colorToHex(c.financial.income),
      expense: colorToHex(c.financial.expense),
      transfer: colorToHex(c.financial.transfer),
    },
    labels: {
      billTitle: t('floating.billTitle'),
      dirExpense: t('floating.dirExpense'),
      dirIncome: t('floating.dirIncome'),
      dirTransfer: t('floating.dirTransfer'),
      amountLabel: t('floating.amountLabel'),
      payeeLabel: t('floating.payeeLabel'),
      narrationLabel: t('floating.narrationLabel'),
      narrationHint: t('floating.narrationHint'),
      categoryExpense: t('floating.categoryExpense'),
      categoryIncome: t('floating.categoryIncome'),
      transferTarget: t('floating.transferTarget'),
      accountExpense: t('floating.accountExpense'),
      accountIncome: t('floating.accountIncome'),
      accountTransfer: t('floating.accountTransfer'),
      openApp: t('floating.openApp'),
      dismiss: t('floating.dismiss'),
      confirm: t('floating.confirm'),
      ballOcr: t('floating.ballOcr'),
      ballRemember: t('floating.ballRemember'),
      rememberSuccess: t('floating.rememberSuccess'),
      rememberFail: t('floating.rememberFail'),
      pageRemembered: t('floating.pageRemembered'),
      pageSignatureExists: t('floating.pageSignatureExists'),
    },
  };
}

/** 构建并推送到原生（bridge 不可用或推送异常时静默返回 false，不抛出）。 */
export async function pushFloatingUiConfig(theme: ThemeTokens, t: TranslateFn): Promise<boolean> {
  const bridge = getAccessibilityBridge();
  if (!bridge) return false;
  try {
    return await bridge.setFloatingUiConfig(buildFloatingUiConfig(theme, t));
  } catch (e) {
    logger.debug('floatingUiConfig', '[推送浮层配置] 原生调用失败', e);
    return false;
  }
}
