/**
 * 错误信息友好化转换
 * ===================
 *
 * 优先按后端返回的 error_code 识别错误类型，回退到原始错误文本兜底匹配。
 */

interface ErrorWithCode extends Error {
  errorCode?: string;
}

function getErrorCode(error: unknown): string | undefined {
  return (error as ErrorWithCode).errorCode;
}

function getErrorMessage(error: unknown): string {
  return error instanceof Error ? error.message : String(error);
}

/**
 * 判断是否为积分不足错误
 */
export function isInsufficientPointsError(error: unknown): boolean {
  const errorCode = getErrorCode(error);
  if (errorCode === 'insufficient_points') {
    return true;
  }
  // 兜底：兼容旧后端或第三方错误
  const raw = getErrorMessage(error);
  return raw.includes('积分不足') || raw.includes('402');
}

/**
 * 判断是否为内容安全/审核不通过错误
 */
export function isContentViolationError(error: unknown): boolean {
  return getErrorCode(error) === 'content_violation';
}

/**
 * 将错误转换为用户友好的提示文案
 */
export function getFriendlyErrorMessage(error: unknown, defaultMsg = '操作失败'): string {
  const errorCode = getErrorCode(error);

  // 1. 应用级结构化错误码（优先）
  switch (errorCode) {
    case 'content_violation':
      return '人物分镜台词未通过安全审核，请修改后重试';
    case 'insufficient_points':
      return '积分不足，请先充值后再尝试';
    case 'prompt_not_found':
      return '当前选择的创作类型暂不可用，请尝试其他类型或联系客服';
    case 'empty_result':
      return '生成内容为空，请调整创作主题后重试';
    case 'parse_error':
      return '数据解析异常，请稍后重试或联系客服';
    case 'timeout':
      return '服务响应超时，请稍后重试';
    case 'rate_limit':
      return '当前请求过于频繁，请稍后再试';
    case 'auth_failed':
      return '第三方服务认证失败，请稍后重试或联系客服';
    case 'quota_exhausted':
      return '第三方服务额度已用完，请稍后重试或联系客服';
    case 'server_error':
      return '第三方服务繁忙，请稍后重试';
    case 'bad_request':
      return '请求参数错误，请检查后重试';
    case 'not_found':
      return '请求的资源不存在，请检查后重试';
  }

  // 2. 兜底：按原始错误文本关键词映射（兼容旧后端/网络层错误）
  const raw = getErrorMessage(error).toLowerCase();

  if (
    raw.includes('timeout') ||
    raw.includes('超时') ||
    raw.includes('etimedout')
  ) {
    return '服务响应超时，请稍后重试';
  }

  if (
    raw.includes('network') ||
    raw.includes('fetch') ||
    raw.includes('failed to fetch') ||
    raw.includes('econnrefused') ||
    raw.includes('econnreset') ||
    raw.includes('enotfound')
  ) {
    return '网络连接异常，请检查网络后重试';
  }

  if (raw.includes('未找到提示词') || raw.includes('prompt')) {
    return '当前选择的创作类型暂不可用，请尝试其他类型或联系客服';
  }

  if (raw.includes('任务结果为空') || raw.includes('生成分镜为空')) {
    return '生成内容为空，请调整创作主题后重试';
  }

  if (raw.includes('数据解析失败') || raw.includes('数据适配失败')) {
    return '数据解析异常，请稍后重试或联系客服';
  }

  return defaultMsg;
}
