/**
 * 元素定位 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
}

/**
 * 智能定位步骤定义
 */
export interface SmartLocateStep {
  /** 步骤顺序 */
  order: number
  /** 步骤名称 */
  name: string
  /** 动作类型 */
  action: string
  /** 动作参数 */
  params: Record<string, any>
}

/**
 * 智能定位请求参数
 */
export interface SmartLocateRequest {
  /** 步骤列表 */
  steps: SmartLocateStep[]
  /** 是否自动登录（默认 true） */
  auto_login?: boolean
  /** 目标菜单名称 */
  navigate_menu?: string
  /** 被测系统基础 URL */
  page_url?: string
}

/**
 * 智能定位结果
 */
export interface SmartLocateResult {
  /** 步骤顺序 */
  order: number
  /** 步骤名称 */
  name: string
  /** 是否成功 */
  success: boolean
  /** 动作类型 */
  action: string
  /** 动作参数（含 selector） */
  params: Record<string, any>
  /** 选择器信息 */
  selectors: {
    primary: string | null
    candidates: Array<{
      type: string
      value: string
      confidence: number
      priority: number
    }>
  }
  /** 元素信息 */
  element_info: Record<string, any>
  /** 页面截图（base64，可选） */
  screenshot?: string
  /** 说明信息 */
  message: string
  /** 生成的 semantic 语义目标（阶段6语义化用例生成器） */
  semantic?: Record<string, any> | null
  /** 条件生成的 verify 状态验证 */
  verify?: Record<string, any> | null
}

/**
 * 智能定位响应
 */
export interface SmartLocateResponse {
  /** 总体是否成功 */
  success: boolean
  /** 总步骤数 */
  total_steps: number
  /** 成功定位步骤数 */
  located_steps: number
  /** 定位结果列表 */
  results: SmartLocateResult[]
  /** 总体说明 */
  message: string
  /** 动态数据参数初值（param{N}: 值，阶段6 CTX 化收集） */
  parameters?: Record<string, string>
}

/**
 * 元素定位 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
  },

  /**
   * 智能定位（新）
   *
   * 自动访问被测系统、执行操作、提取选择器。
   * 不依赖 Claude CLI，通过实际执行验证选择器。
   *
   * @param data - 智能定位请求参数
   * @returns 每个步骤的定位结果
   *
   * @example
   * const result = await elementLocateApi.smartLocate({
   *   steps: [
   *     { order: 1, name: '点击新增按钮', action: 'click', params: {} },
   *     { order: 2, name: '等待页面加载', action: 'wait', params: { timeout: 10000 } }
   *   ],
   *   auto_login: true,
   *   navigate_menu: '信息发布'
   * })
   *
   * if (result.success) {
   *   console.log(`成功定位 ${result.located_steps}/${result.total_steps} 个步骤`)
   *   result.results.forEach(step => {
   *     if (step.success) {
   *       console.log(`步骤 ${step.order}: ${step.selectors.primary}`)
   *     }
   *   })
   * }
   */
  async smartLocate(data: SmartLocateRequest): Promise<SmartLocateResponse> {
    const response = await request.post('/api/element/smart-locate', data, {
      timeout: 600000,  // 智能定位可能需要较长时间（登录+导航+Claude语义增强），10分钟
    })
    return response as any
  },
}