/**
 * CQ-05: 统一错误处理模块
 * 提供一致的错误处理模式，替换分散的 try-catch
 */

export class AppError extends Error {
  constructor(
    message: string,
    public readonly code: string,
    public readonly cause?: unknown
  ) {
    super(message)
    this.name = 'AppError'
  }
}

/** 日志级别的错误处理（仅 console.error，不中断流程） */
export function logError(context: string, error: unknown): void {
  const message = error instanceof Error ? error.message : String(error)
  // eslint-disable-next-line no-console -- intentional logging utility
  console.error(`[${context}] ${message}`, error)
}

/** 用户操作级错误处理（返回友好的错误信息给 showToast） */
export function getErrorMessage(error: unknown, fallback: string): string {
  if (error instanceof AppError) return error.message
  if (error instanceof Error) return `${fallback}: ${error.message}`
  return fallback
}

/** 通用 try-catch 包装器，返回 [result, error] */
export async function tryAsync<T>(
  fn: () => Promise<T>,
  context: string
): Promise<[T | null, null] | [null, AppError]> {
  try {
    const result = await fn()
    return [result, null]
  } catch (error) {
    const message = error instanceof Error ? error.message : String(error)
    return [null, new AppError(`${context}: ${message}`, context, error)]
  }
}
