const FAILURE_REASON_FALLBACK = '系统已记录失败原因，请稍后重试或查看任务日志';

const FAILURE_REASON_MESSAGES: Record<string, string> = {
  account_missing: '未配置 1688 执行账户',
  ai_selection_unavailable_or_invalid: 'AI 未返回可用选择，已使用兜底结果',
  auto_login_failed: '1688 自动登录失败',
  brand_hit_rate_calculation_failed: '品牌命中率计算失败',
  brand_zero_hit_stop: '品牌命中率为 0%，已停止后续搜索',
  browser_target_crashed: '搜索浏览器崩溃，未进入结果页',
  canvas_context_unavailable: '图片处理画布不可用',
  captcha_intercept: '历史记录：1688 滑块验证未通过，当时已跳过当前阶段',
  captcha_unresolved: '1688 验证码未解除',
  chat_frame_not_found: '未找到旺旺聊天窗口',
  chat_input_not_found: '未找到旺旺消息输入框',
  contact_enrichment_skipped: '联系方式补齐已跳过',
  contact_navigation_failed: '联系方式页导航失败',
  contact_page_direct_failed: '联系方式页直达失败',
  contact_page_no_contacts: '联系方式页未检测到完整电话',
  contact_page_not_reached: '未进入联系方式页',
  contact_selection_required: '旺旺会话需要人工选择联系人',
  continue_after_error: '当前阶段出错，已继续后续搜索',
  continue_next_round: '当前阶段未满足条件，继续下一轮搜索',
  conversation_code_missing: '未获取到旺旺会话编号',
  conversation_list_item_not_found: '未在旺旺会话列表中找到目标会话',
  conversation_not_found: '未找到目标旺旺会话',
  duplicate_merchant: '商家已联系过，已跳过',
  duplicate_skip: '重复阶段已跳过',
  downloaded_file_not_image: '下载文件不是有效图片',
  empty_keyword: '搜索词为空，已跳过',
  fallback_no_repeated_tokens: '标题相似度兜底未找到重复关键词',
  fallback_text_title_similarity: '已使用标题相似度兜底判断',
  fallback_title_similarity: '已使用标题相似度兜底判断',
  hit_rate_calculation_failed: '命中率计算失败',
  http_error: '1688 页面请求失败',
  heuristic_best_image: '已使用规则选择最佳图片',
  image_compress_failed: '图片压缩失败',
  image_data_url_invalid: '图片数据格式无效',
  image_file_not_found: '图片文件不存在',
  image_rule_rejected: '图片规则校验未通过',
  image_selection_failed: '图片选择失败',
  image_source_missing: '缺少图片来源',
  image_upload_input_not_found: '未找到图片上传入口',
  imsdk_conversation_service_missing: '旺旺会话服务不可用',
  insufficient_image_samples: '图片样本不足，无法完成校验',
  insufficient_source_candidates: '原始候选商家不足目标数',
  llm_fallback_error: 'LLM 兜底判断失败',
  llm_fallback_invalid_rate: 'LLM 兜底返回的命中率无效',
  llm_fallback_parse_failed: 'LLM 兜底结果解析失败',
  llm_online_failed: '在线 LLM 商品匹配失败',
  llm_semantic_recovered: '已通过 LLM 语义兜底恢复判定',
  llm_semantic_zero: 'LLM 语义兜底判定为 0 命中',
  llm_unavailable: 'LLM 服务不可用',
  local_zero_hit: '本地规则判定为 0 命中',
  login_intercept: '1688 登录态失效或被登录页拦截',
  login_required: '1688 登录态失效或需要重新登录',
  matched_candidates_exhausted_or_valid_phone_insufficient: 'LLM 匹配候选耗尽或有效电话不足',
  message_not_confirmed_in_frame: '旺旺消息未确认发送成功',
  missing_contact_handle: '缺少旺旺联系人标识',
  missing_contact_url: '缺少旺旺联系链接',
  missing_offer_url: '缺少商品链接',
  no_candidates: '没有可展示的候选商家',
  no_results: '搜索页没有返回结果',
  no_search_candidates: '没有搜索候选商品',
  no_titles: '没有可用于判断的商品标题',
  no_validation_results: '没有可用的校验结果',
  offer_detail_not_ready_but_contact_failed: '详情页未就绪且联系方式抓取失败',
  offer_reload_failed: '商品详情页重新加载失败',
  profile_in_use: 'Chrome 用户数据目录被占用，请关闭残留浏览器后重试',
  regeneration_parse_failed: '搜索词重生成结果解析失败',
  round_failed: '当前阶段执行失败，已跳过',
  semantic_ai_error: '语义判断服务返回异常',
  semantic_client_missing: '语义判断服务未配置',
  semantic_client_unavailable: '语义判断服务不可用',
  semantic_no_titles: '缺少可用于语义判断的标题',
  semantic_noise_detected: '标题中检测到明显干扰词',
  semantic_noise_not_detected: '标题中未检测到明显干扰词',
  semantic_parse_failed: '语义判断结果解析失败',
  source_exhausted_before_target: '候选商家已耗尽仍未达到目标',
  text_rules_rejected: '文本规则校验未通过',
  upload_image_failed: '图片上传失败',
  vision_error_fallback: '图片识别失败，已使用兜底判断',
  vision_parse_failed: '图片识别结果解析失败',
  visual_check_skipped: '图片校验已跳过',
  vision_text_image_majority_match: '文本和图片多数校验通过',
};

function normalizeReasonKey(value: string) {
  return value.trim().toLowerCase().replace(/[\s-]+/g, '_');
}

function hasChineseText(value: string) {
  return /[\u3400-\u9fff]/.test(value);
}

function isEnglishOrCodeLike(value: string) {
  return Array.from(value).every(char => char.charCodeAt(0) <= 0x7f) && /[a-zA-Z]/.test(value);
}

function translateRuntimeFailure(value: string) {
  if (/\[keyword_process\].*upsert/i.test(value) || /ON CONFLICT specification/i.test(value)) {
    return '关键词生成结果保存失败，请检查数据库约束或稍后重试';
  }

  if (/there is no unique or exclusion constraint matching/i.test(value)) {
    return '数据保存失败：数据库缺少唯一约束，请检查配置后重试';
  }

  if (/Target page, context or browser has been closed/i.test(value)) {
    return '浏览器页面已关闭，可能是人工验证窗口被关闭';
  }

  const timeoutMatch = value.match(/(page\.[a-z]+|locator\.[a-z]+|browserType\.[a-z]+)?:?\s*Timeout\s+(\d+)ms exceeded/i);
  if (timeoutMatch) {
    const operation = timeoutMatch[1] ? timeoutMatch[1].trim() : '页面操作';
    return `页面操作超时：${operation} 超过 ${timeoutMatch[2]}ms`;
  }

  if (/user data directory is already in use|ProcessSingleton|SingletonLock|profile.*in use/i.test(value)) {
    return FAILURE_REASON_MESSAGES.profile_in_use;
  }

  return '';
}

export function translateFailureReason(reason: string | null | undefined, fallback = FAILURE_REASON_FALLBACK) {
  const trimmed = String(reason ?? '').trim();
  if (!trimmed) {
    return '';
  }

  const runtimeFailure = translateRuntimeFailure(trimmed);
  if (runtimeFailure) {
    return runtimeFailure;
  }

  if (hasChineseText(trimmed)) {
    return trimmed;
  }

  const normalized = normalizeReasonKey(trimmed);
  if (FAILURE_REASON_MESSAGES[normalized]) {
    return FAILURE_REASON_MESSAGES[normalized];
  }

  const httpMatch = normalized.match(/^http_(\d{3})$/);
  if (httpMatch) {
    return `1688 页面请求失败（HTTP ${httpMatch[1]}）`;
  }

  const imageDownloadMatch = trimmed.match(/^image-download-failed:(\d{3})$/i);
  if (imageDownloadMatch) {
    return `图片下载失败（HTTP ${imageDownloadMatch[1]}）`;
  }

  if (isEnglishOrCodeLike(trimmed)) {
    return fallback;
  }

  return trimmed;
}
