/**
 * 深度链接（plan.md「1.5 深度链接」）。
 * 参考 BeeCount 的 beecount:// URL scheme。
 *
 * 本模块定义 URL 解析逻辑（纯函数，可单测），
 * 实际的 Linking 事件监听在 App 层调用 setup。
 */

import type { TransactionDraft } from '../domain/core/types';

const PREFIX = 'beanmobile://';

export type DeepLinkAction =
  | { type: 'add-transaction'; draft?: Partial<TransactionDraft> }
  | { type: 'ocr-camera' }
  | { type: 'ocr-image'; imageUri?: string }
  | { type: 'voice-input' }
  | { type: 'import-csv' }
  | { type: 'open-tab'; tab: 'home' | 'transactions' | 'import' | 'rules' | 'settings' };

/** 解析深度链接 URL。 */
export function parseDeepLink(url: string): DeepLinkAction | null {
  if (!url.startsWith(PREFIX)) return null;
  const path = url.slice(PREFIX.length);
  const [action, ...params] = path.split('/');

  switch (action) {
    case 'add':
      return { type: 'add-transaction', draft: parseDraftParams(params) };
    case 'ocr':
      if (params[0] === 'camera') return { type: 'ocr-camera' };
      if (params[0] === 'image') return { type: 'ocr-image', imageUri: params[1] };
      return null;
    case 'voice':
      return { type: 'voice-input' };
    case 'import':
      return { type: 'import-csv' };
    case 'tab': {
      const validTabs = ['home', 'transactions', 'import', 'rules', 'settings'] as const;
      const tab = params[0] as typeof validTabs[number];
      return validTabs.includes(tab) ? { type: 'open-tab', tab } : null;
    }
    default:
      return null;
  }
}

function parseDraftParams(params: string[]): Partial<TransactionDraft> {
  // beanmobile://add?amount=24.5&narration=咖啡 格式
  const query = params.join('/');
  const search = query.split('?')[1] ?? '';
  const sp = new URLSearchParams(search);
  const draft: Partial<TransactionDraft> = {};
  if (sp.get('narration')) draft.narration = sp.get('narration')!;
  const date = sp.get('date');
  if (date && /^\d{4}-\d{2}-\d{2}$/.test(date)) draft.date = date;
  const amount = sp.get('amount');
  if (amount && /^\d+(\.\d+)?$/.test(amount)) {
    draft.postings = [
      { account: 'Assets:Unknown', amount: `-${amount}`, currency: 'CNY' },
      { account: 'Expenses:未分类', amount, currency: 'CNY' },
    ];
  }
  return draft;
}

/** 构建深度链接 URL（反向操作）。 */
export function buildDeepLink(action: DeepLinkAction): string {
  switch (action.type) {
    case 'add-transaction':
      return `${PREFIX}add`;
    case 'ocr-camera':
      return `${PREFIX}ocr/camera`;
    case 'ocr-image':
      return `${PREFIX}ocr/image/${action.imageUri ?? ''}`;
    case 'voice-input':
      return `${PREFIX}voice`;
    case 'import-csv':
      return `${PREFIX}import`;
    case 'open-tab':
      return `${PREFIX}tab/${action.tab}`;
  }
}

/** 深度链接动作处理器（由 setupDeepLinking 注入路由）。 */
export type DeepLinkHandler = (action: DeepLinkAction) => void;

/**
 * 注册深度链接监听（plan.md「1.5 setupDeepLinking」）。
 *
 * 在 App 入口调用，处理冷启动 URL + 运行时 URL 变化。
 * 返回清理函数（组件卸载时调用）。
 *
 * 生产环境用 expo-linking 的 Linking.addEventListener；
 * 测试环境（无 Linking）安全降级为 no-op。
 */
export function setupDeepLinking(handler?: DeepLinkHandler): () => void {
  const handle = handler ?? defaultHandler;
  let mounted = true;

  // 动态导入 expo-linking（避免测试环境引入 RN 依赖）
  // 生产环境：Linking.addEventListener + getInitialURL
  try {
     
    const Linking = require('expo-linking') as {
      addEventListener: (type: 'url', cb: (e: { url: string }) => void) => { remove: () => void };
      getInitialURL: () => Promise<string | null>;
    };

    // 监听运行时 URL 变化
    const sub = Linking.addEventListener('url', ({ url }) => {
      const action = parseDeepLink(url);
      if (action) handle(action);
    });

    // 处理冷启动 URL
    Linking.getInitialURL().then(url => {
      if (!mounted || !url) return;
      const action = parseDeepLink(url);
      if (action) handle(action);
    });

    return () => {
      mounted = false;
      sub.remove();
    };
  } catch {
    // 测试环境无 expo-linking，安全降级
    return () => { mounted = false; };
  }
}

/** 默认处理器：按动作类型路由跳转（生产环境注入 router）。 */
const defaultHandler: DeepLinkHandler = (action) => {
  // 实际跳转由 _layout.tsx 注入 router 实现
  // 这里仅记录日志
  // eslint-disable-next-line no-console
  console.log('[deepLink]', action.type);
};
