/**
 * 元素定位 API
 *
 * 提供本地元素定位功能，通过 Playwright 访问被测页面，
 * 提取可交互元素，匹配步骤描述，返回候选定位器列表。
 * 支持单个步骤定位和批量定位（一键获取用例所有步骤的定位）。
 *
 * @module api/elementLocate
 * @author czj
 * @date 2026-08-03
 */

import request from '@/utils/request'

/**
 * 元素定位请求参数
 */
export interface LocateRequest {
  /** 步骤描述，如"输入用户名" */
  step_description: string
  /** 目标页面 URL */
  page_url: string
  /** 预期结果（可选） */
  expected?: string
  /** 是否自动登录（默认 true） */
  auto_login?: boolean
}

/**
 * 定位候选
 */
export interface LocateCandidate {
  /** 定位类型: css/xpath/text/id/name */
  locator_type: string
  /** 定位值 */
  locator_value: string
  /** 置信度 0-1 */
  confidence: number
  /** 元素信息 */
  element_info: Record<string, any>
}

/**
 * 元素定位响应
 */
export interface LocateResponse {
  /** 是否成功 */
  success: boolean
  /** 候选定位器列表（按置信度降序） */
  candidates: LocateCandidate[]
  /** 消息 */
  message: string
  /** 页面截图（base64，可选） */
  screenshot?: string
}

/**
 * 批量元素定位请求参数
 */
export interface BatchLocateRequest {
  /** 用例 ID */
  case_id: string
  /** 目标页面 URL */
  page_url?: string
  /** 是否自动登录（默认 true） */
  auto_login?: boolean
  /** 页面加载超时时间（毫秒，默认 10000） */
  page_load_timeout?: number
  /** 页面加载后额外等待时间（毫秒，默认 5000） */
  extra_wait_time?: number
  /** 等待特定元素出现（CSS选择器） */
  wait_for_selector?: string
  /** 元素为空时是否重试（默认 true） */
  retry_on_empty?: boolean
  /** 最大重试次数（默认 2） */
  max_retries?: number
  /** 目标菜单名称（如"会议管理"、"信息管理"，支持智能推断） */
  navigate_menu?: string
}

/**
 * 单个步骤的定位结果
 */
export interface StepLocateResult {
  /** 步骤顺序 */
  order: number
  /** 步骤描述 */
  description: string
  /** 是否成功 */
  success: boolean
  /** 定位类型 */
  locator_type: string
  /** 定位值 */
  locator_value: string
  /** 置信度 */
  confidence: number
  /** 消息 */
  message: string
}

/**
 * 批量元素定位响应
 */
export interface BatchLocateResponse {
  /** 是否成功 */
  success: boolean
  /** 用例 ID */
  case_id: string
  /** 总步骤数 */
  total_steps: number
  /** 成功定位步骤数 */
  located_steps: number
  /** 每个步骤的定位结果 */
  results: StepLocateResult[]
  /** 消息 */
  message: string
  /** 提取到的元素总数 */
  elements_extracted?: number
  /** 实际重试次数 */
  retries?: number
  /** 页面加载耗时（秒） */
  page_load_time?: number
}

/**
 * 元素定位 API
 */
export const elementLocateApi = {
  /**
   * 执行单个步骤元素定位
   */
  async locate(data: LocateRequest): Promise<LocateResponse> {
    const response = await request.post('/api/element/locate', data, {
      timeout: 60000,
    })
    return response as any
  },

  /**
   * 批量元素定位（一键获取用例所有步骤的定位）
   *
   * @param data - 批量定位请求参数
   * @returns 每个步骤的定位结果
   *
   * @example
   * const result = await elementLocateApi.locateBatch({
   *   case_id: 'case_xxx',
   *   page_url: 'https://192.168.5.44/',
   *   auto_login: true,
   * })
   *
   * if (result.success) {
   *   console.log(`成功定位 ${result.located_steps}/${result.total_steps} 个步骤`)
   * }
   */
  async locateBatch(data: BatchLocateRequest): Promise<BatchLocateResponse> {
    const response = await request.post('/api/element/locate-batch', data, {
      timeout: 120000,  // 批量定位可能需要较长时间
    })
    return response as any
  },
}