import { Provide, Scope, ScopeEnum } from '@midwayjs/core';

export interface SnapshotResult {
  /** YAML 格式的 ARIA 树，由 patchright 内置 ariaSnapshot 生成（与 playwright 同款） */
  text: string;
  /** 当前页面 url */
  url: string;
}

@Provide()
@Scope(ScopeEnum.Singleton)
export class SnapshotRefService {
  /**
   * 直接调用 patchright 内置 page.ariaSnapshot({ mode: 'ai' })，
   * 完整复用 playwright 的 ARIA 树生成 + ref 分配 + iframe 递归 + W3C accname 等所有逻辑。
   *
   * 输出格式（YAML）：
   *   - heading "标题" [level=1] [ref=e1]
   *   - link "已买到的宝贝" [ref=e2]
   *   - listitem [ref=e3]:
   *     - text: "城上轻居酒店..."
   *     - text: "¥99"
   */
  async snapshot(_sessionName: string, page: any): Promise<SnapshotResult> {
    let text: string = '';
    try {
      text = await page.ariaSnapshot({ mode: 'ai' });
    } catch (e: any) {
      // ariaSnapshot 可能在页面还没 ready 时抛错，等 1s 重试一次
      await new Promise(r => setTimeout(r, 1000));
      try {
        text = await page.ariaSnapshot({ mode: 'ai' });
      } catch { /* 仍然失败就返回空 */ }
    }
    // 如果空，可能页面还在加载/重定向中，返回 URL 让 AI 判断
    return { text: (text ?? '').slice(0, 30000), url: page.url() };
  }

  /** ref 反查选择器：用 patchright 原生 aria-ref 选择器引擎（与 ariaSnapshot 一致的 ref 注册表） */
  refToSelector(ref: string): string {
    return `aria-ref=${ref}`;
  }
}
