/**
 * iOS 快捷指令/分享扩展入口（plan.md「Phase 7 iOS 自动记账方案」）。
 *
 * iOS 通过 AppIntent（iOS 16+）或 Share Extension 接收账单截图，
 * 经 NativeEventEmitter 推送到 JS 层。
 *
 * 原生 Swift 实现（AutoBillingAppIntent.swift）位于 ios/，由 iOS 构建打包。
 * 本模块定义 JS 接收端：监听原生事件 + 处理截图。
 */

import type { ScreenshotEvent } from './automation/screenshot';

/** 原生 AppIntent 事件（iOS Swift 推送）。 */
export interface IosAppIntentEvent {
  type: 'screenshot' | 'share-image' | 'voice';
  path?: string;        // 截图临时路径
  base64?: string;      // 图片 base64（若已读取）
  text?: string;        // 语音转文字（voice 类型）
}

/** 原生 AppIntent 桥接契约。 */
export interface IosAppIntentBridge {
  /** 监听原生事件。 */
  addListener(handler: (event: IosAppIntentEvent) => void): () => void;
  /** 通知原生记账完成（iOS 后台窗口放行）。 */
  notifyBillingComplete(): Promise<void>;
}

/**
 * iOS 快捷指令协调器：接收原生事件 → 转 ScreenshotEvent → 交 ScreenshotChannel 处理。
 */
export class IosShortcutsChannel {
  private unsubscribe: (() => void) | null = null;

  constructor(
    private readonly bridge: IosAppIntentBridge | null,
    private readonly onEvent: (event: IosAppIntentEvent) => void,
  ) {}

  /** 启动监听。 */
  start(): void {
    if (!this.bridge) return;
    this.unsubscribe = this.bridge.addListener(event => this.handleEvent(event));
  }

  /** 停止监听。 */
  stop(): void {
    this.unsubscribe?.();
    this.unsubscribe = null;
  }

  /** 处理单个原生事件（可手动调用，测试用）。 */
  async handleEvent(event: IosAppIntentEvent): Promise<void> {
    this.onEvent(event);
    // 截图/分享图片类型：转换后由调用方交 ScreenshotChannel
    if (event.type === 'screenshot' || event.type === 'share-image') {
      // 上层（automationStore）接收后走 OCR + pipeline
    }
  }

  /** 通知记账完成（iOS 后台 30s 窗口放行）。 */
  async notifyComplete(): Promise<void> {
    await this.bridge?.notifyBillingComplete();
  }
}

/** 模拟 iOS AppIntent 桥接（测试用）。 */
export class SimulatedIosAppIntentBridge implements IosAppIntentBridge {
  private handlers: ((e: IosAppIntentEvent) => void)[] = [];
  public completedCount = 0;

  addListener(handler: (e: IosAppIntentEvent) => void): () => void {
    this.handlers.push(handler);
    return () => {
      this.handlers = this.handlers.filter(h => h !== handler);
    };
  }
  async notifyBillingComplete(): Promise<void> {
    this.completedCount++;
  }
  /** 测试辅助：模拟原生事件。 */
  simulate(event: IosAppIntentEvent): void {
    this.handlers.forEach(h => h(event));
  }
}

/**
 * 分享扩展处理（plan.md「7.2 分享扩展」）。
 * 用户从其他 App 分享账单截图到 beancount-mobile。
 */
export function handleSharedImage(base64: string): ScreenshotEvent {
  return {
    uri: `share-extension:${Date.now()}`,
    base64,
    timestamp: Date.now(),
  };
}
