/**
 * 无障碍服务 JS 桥接（plan.md「3.6 无障碍服务」JS 接线）。
 *
 * 原生 AccessibilityBridgeModule（由 Config Plugin 注入）暴露以下方法：
 * - isServiceRunning() → Promise<boolean>
 * - rememberCurrentPage() → Promise<{ package, activity, signature }>
 * - triggerManualOcr() → Promise<boolean>
 * - getPageSignatures() → Promise<PageSignature[]>
 * - clearPageSignatures() → Promise<boolean>
 * - removePageSignature(sig) → Promise<boolean>
 * - getPaymentPackages() → Promise<string[]>
 * - getTopApp() → Promise<{ package, activity }>
 * - showFloatingBill(amount, merchant, time, packageName, categories, accounts, direction, currency, draftId) → Promise<boolean>
 * - setFloatingBallEnabled(enabled) → Promise<boolean>
 * - setFloatingUiConfig(config) → Promise<boolean>  （P6：浮层 UI 配置下发，见 floatingUiConfig.ts）
 * - isNotificationListenerEnabled() → Promise<boolean>  （P7：通知监听状态检测）
 * - canDrawOverlays() → Promise<boolean>  （P7b：悬浮窗权限检测）
 * - copyOcrModelsFromAssets() → Promise<string>  （P8：从 APK assets 复制 OCR 模型到 filesDir）
 *
 * 在非 Android / 原生模块未加载环境（测试/Web）返回 null，调用方应优雅降级。
 */

import type { FloatingUiConfig } from './floatingUiConfig';
import { logger } from '../../utils/logger';

/** 已记住的页面签名。 */
export interface PageSignature {
  /** 完整签名（pkg|activity）。 */
  signature: string;
  /** 包名。 */
  package: string;
  /** Activity 类名。 */
  activity: string;
}

/** 当前顶部 App 信息。 */
export interface TopAppInfo {
  package: string;
  activity: string;
}

/** 记住页面结果。 */
export interface RememberPageResult {
  package: string;
  activity: string;
  signature: string;
}

/** 原生 AccessibilityBridge 模块契约。 */
export interface NativeAccessibilityBridge {
  isServiceRunning(): Promise<boolean>;
  rememberCurrentPage(): Promise<RememberPageResult>;
  triggerManualOcr(): Promise<boolean>;
  getPageSignatures(): Promise<PageSignature[]>;
  clearPageSignatures(): Promise<boolean>;
  removePageSignature(signature: string): Promise<boolean>;
  getPaymentPackages(): Promise<string[]>;
  getTopApp(): Promise<TopAppInfo>;
  bringAppToForeground(): Promise<boolean>;
  showFloatingBill(
    amount: string,
    merchant: string,
    time: string,
    packageName: string,
    categories: Array<{ id: string; name: string; account: string; type?: string }>,
    accounts: string[],
    direction: string,
    currency: string,
    draftId: string
  ): Promise<boolean>;
  setFloatingBallEnabled(enabled: boolean): Promise<boolean>;
  setFloatingUiConfig(config: FloatingUiConfig): Promise<boolean>;
  isNotificationListenerEnabled(): Promise<boolean>;
  canDrawOverlays(): Promise<boolean>;
  copyOcrModelsFromAssets(): Promise<string>;
}

/**
 * 获取原生 AccessibilityBridge 模块。
 * 在非 RN 环境（测试）或非 Android 平台返回 null。
 * 缓存结果，避免每次调用都重复 require。
 */
let _bridge: NativeAccessibilityBridge | null = null;
let _bridgeTried = false;
export function getAccessibilityBridge(): NativeAccessibilityBridge | null {
  if (!_bridgeTried) {
    _bridgeTried = true;
    try {
      const { Platform, NativeModules } = require('react-native');
      if (Platform.OS === 'android') {
        const mod = (NativeModules as { AccessibilityBridge?: NativeAccessibilityBridge }).AccessibilityBridge;
        _bridge = mod ?? null;
      }
    } catch {
      // 非 RN 环境（测试）：react-native 不可用
    }
  }
  return _bridge;
}

/** 包名 → 友好名称映射（数据源见 constants.ts PAYMENT_PACKAGES）。 */
import { PAYMENT_PACKAGES } from '../../domain/core/constants';

/** 根据包名获取友好名称（未知包名返回原始包名）。 */
export function getPackageLabel(pkg: string): string {
  return PAYMENT_PACKAGES[pkg] ?? pkg;
}

/** 获取支付 App 白名单的友好标签列表。 */
export async function getPaymentPackageLabels(): Promise<{ package: string; label: string }[]> {
  const bridge = getAccessibilityBridge();
  if (!bridge) return [];
  try {
    const packages = await bridge.getPaymentPackages();
    return packages.map(pkg => ({ package: pkg, label: getPackageLabel(pkg) }));
  } catch (e) {
    logger.debug('accessibilityBridge', '[获取支付包名] 原生调用失败', e);
    return [];
  }
}
