/**
 * 测试用例类型定义
 *
 * @module types/case
 * @author czj
 * @date 2026-07-09
 */

/** 语义目标（语义化用例执行） */
export interface SemanticTarget {
  /** 元素类型: button/input/textarea/checkbox/row_checkbox/row/tab/link/menu/icon/text/dialog */
  type?: string
  /** 主匹配文本（渲染后用于映射精确键 + DOM 文本/placeholder） */
  text?: string
  /** 行/单元格次级过滤文本 */
  contains?: string
  /** 页面注册表 id（scope） */
  scope?: string
  /** 角色/辅助提示（如 tab 的 aria-selected） */
  role?: string
  /** 第 N 个匹配（1 起） */
  nth?: number
  /** 父容器约束 → 组合选择器 */
  container?: {
    type?: string
    selector?: string
    title?: string
  }
  /** 提取元素值写入上下文变量（save_as） */
  save_as?: string | Record<string, string>
}

/** 状态验证（防假通过） */
export interface StepVerify {
  /** 验证类型: text_visible/element_visible/url_contains/dialog 等 */
  type?: string
  /** 验证选择器 */
  selector?: string
  /** 期望文本 */
  text?: string
  /** 超时 ms */
  timeout?: number
  /** true 失败则步骤真实 failed（缺省 false 只 warn） */
  must?: boolean
}

/** 测试步骤定义 */
export interface StepDefinition {
  /** 步骤顺序 */
  order: number
  /** 步骤名称 */
  name: string
  /** 动作类型 (navigate/click/fill/assert等) */
  action: string
  /** 动作参数 */
  params: Record<string, any>
  /** 预期结果 */
  expected?: string
  /** 实际结果（预留） */
  actual?: string
  /** 多选择器回退链 */
  selectors?: string[]
  /** SelectorMapper 页面标识 */
  pageKey?: string
  /** 元素标识 */
  elementKey?: string
  /** 强制点击 */
  force?: boolean
  /** 自定义操作后延时(ms) */
  waitAfter?: number
  /** 定位类型: css / xpath / text / id / name */
  locator_type?: string
  /** 定位值 */
  locator_value?: string
  /** 语义目标（语义化用例执行，后端 snake_case 序列化） */
  semantic?: SemanticTarget
  /** 状态验证（防假通过，后端 snake_case 序列化） */
  verify?: StepVerify
  /** 执行时机: always/finally/on_failure/on_success（缺省 always） */
  run_on?: 'always' | 'finally' | 'on_failure' | 'on_success'
}

/** 测试用例接口 */
export interface TestCase {
  /** 用例唯一标识 */
  id: string
  /** 所属模块ID */
  moduleId: string
  /** 用例名称 */
  name: string
  /** 用例描述 */
  description: string
  /** 状态 (active/disabled) */
  status: string
  /** 优先级 (high/medium/low) */
  priority: string
  /** 标签列表 */
  tags: string[]
  /** 测试步骤 */
  steps: StepDefinition[]
  /** 执行配置 */
  config: Record<string, any>
  /** 用例类型 ui/api/security/deploy/performance/functional */
  caseType?: string
  /** 用例参数（上下文变量初始值，支持 {__CTX:key__} 引用） */
  parameters?: Record<string, any>
  /** 创建时间 */
  createdAt: string
  /** 更新时间 */
  updatedAt: string
}

/** 创建用例请求参数 */
export interface CreateCaseRequest {
  /** 所属模块ID（后端 snake_case） */
  module_id: string
  /** 用例名称 */
  name: string
  /** 状态: active/disabled（create 时后端默认 active，update 时生效） */
  status?: string
  /** 用例描述 */
  description?: string
  /** 优先级 */
  priority?: string
  /** 标签 */
  tags?: string[]
  /** 步骤 */
  steps?: StepDefinition[]
  /** 配置 */
  config?: Record<string, any>
  /** 用例类型 ui/api/security/deploy/performance/functional */
  case_type?: string
  /** 用例参数（上下文变量初始值） */
  parameters?: Record<string, any>
}

/** 用例列表响应 */
export interface CaseListResponse {
  total: number
  items: TestCase[]
}