/**
 * 通用类型定义
 *
 * 按照constitution要求，提供跨平台通用的类型定义
 */

// HTTP相关通用类型
export interface HTTPRequest {
  /** 请求URL */
  url: string
  /** HTTP方法 */
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
  /** 请求头 */
  headers?: Record<string, string>
  /** 请求体 */
  body?: any
  /** 查询参数 */
  params?: Record<string, any>
  /** 超时时间 */
  timeout?: number
}

export interface HTTPResponse<T = any> {
  /** HTTP状态码 */
  status: number
  /** 状态文本 */
  statusText: string
  /** 是否成功 */
  ok: boolean
  /** 响应数据 */
  data: T
  /** 响应头 */
  headers: Record<string, string>
  /** 响应时间 */
  responseTime: number
}

// 认证相关类型
export interface AuthenticationContext {
  /** 平台标识 */
  platform: string
  /** 账户ID */
  accountId: string
  /** 认证类型 */
  authType: 'ed25519' | 'eip191' | 'hmac-sha256' | 'bearer' | 'api-key'
  /** 凭据信息 */
  credentials: {
    /** API密钥 */
    apiKey?: string
    /** 密钥 */
    secretKey?: string
    /** 私钥 */
    privateKey?: string
    /** 地址 */
    address?: string
    /** Bearer token */
    bearerToken?: string
  }
  /** 认证参数 */
  authParams?: {
    /** 时间戳 */
    timestamp?: number
    /** 随机数 */
    nonce?: number
    /** 签名 */
    signature?: string
  }
}

// 平台配置相关类型
export interface PlatformConfiguration {
  /** 平台名称 */
  platform: string
  /** 基础URL */
  baseUrl: string
  /** WebSocket URL */
  wsUrl?: string
  /** 认证配置 */
  auth: AuthenticationContext
  /** 代理配置 */
  proxy?: ProxyConfiguration
  /** 超时配置 */
  timeout?: {
    connect: number
    read: number
    write: number
  }
  /** 重试配置 */
  retry?: {
    maxAttempts: number
    delay: number
    exponentialBackoff: boolean
  }
  /** 速率限制 */
  rateLimit?: {
    requestsPerSecond: number
    requestsPerMinute: number
    burstLimit: number
  }
}

// 代理相关类型
export interface ProxyConfiguration {
  /** 是否启用 */
  enabled: boolean
  /** 代理URL */
  url?: string
  /** 协议类型 */
  protocol?: 'http' | 'https' | 'socks4' | 'socks5'
  /** 主机地址 */
  host?: string
  /** 端口 */
  port?: number
  /** 用户名 */
  username?: string
  /** 密码 */
  password?: string
  /** 会话配置 */
  session?: {
    prefix: string
    suffix: string
    sticky: boolean
  }
}

export interface ProxyStatus {
  /** 状态 */
  status: 'connected' | 'connecting' | 'disconnected' | 'error'
  /** 代理URL */
  proxyUrl?: string
  /** 地理位置 */
  location?: string
  /** 统计信息 */
  stats: {
    totalRequests: number
    successfulRequests: number
    failedRequests: number
    averageLatency: number
  }
}

export interface ProxyControlOptions {
  /** 是否启用代理 */
  enabled?: boolean
  /** 强制使用指定代理 */
  forceProxy?: ProxyConfiguration
  /** 禁用代理 */
  disableProxy?: boolean
  /** 代理策略 */
  strategy?: 'global' | 'account' | 'force' | 'disabled'
  /** 代理轮换控制 */
  rotation?: {
    enabled?: boolean
    interval?: number
    strategy?: 'round-robin' | 'random' | 'least-used'
  }
  /** 代理健康检查 */
  healthCheck?: {
    enabled?: boolean
    timeout?: number
    failureThreshold?: number
  }
}

export interface RateLimitInfo {
  /** 限制数量 */
  limit: number
  /** 剩余数量 */
  remaining: number
  /** 重置时间 */
  resetTime: Date
  /** 重置间隔（秒） */
  resetInterval: number
  /** 当前窗口开始时间 */
  windowStart?: Date
}

// 性能相关类型
export interface PerformanceMetrics {
  /** 总请求数 */
  totalRequests: number
  /** 成功请求数 */
  successfulRequests: number
  /** 平均响应时间（毫秒） */
  averageResponseTime: number
  /** 99分位响应时间（毫秒） */
  p99ResponseTime: number
  /** 活跃连接数 */
  activeConnections: number
  /** 各平台状态 */
  platforms: Record<string, PlatformPerformance>
}

export interface PlatformPerformance {
  /** 平台名称 */
  name: string
  /** 总请求数 */
  totalRequests: number
  /** 成功率 */
  successRate: number
  /** 平均响应时间 */
  averageResponseTime: number
  /** 最后请求时间 */
  lastRequestTime: Date
  /** 健康状态 */
  healthy: boolean
}

// 健康检查相关类型
export interface HealthStatus {
  /** 整体状态 */
  status: 'healthy' | 'degraded' | 'unhealthy'
  /** 各平台状态 */
  platforms: Record<string, PlatformHealth>
  /** 性能指标 */
  metrics: PerformanceMetrics
  /** 检查时间 */
  timestamp: Date
}

export interface PlatformHealth {
  /** 平台状态 */
  status: 'up' | 'down' | 'degraded'
  /** 响应时间（毫秒） */
  responseTime: number
  /** 成功率（百分比） */
  successRate: number
  /** 最后检查时间 */
  lastCheck: Date
  /** 错误信息 */
  lastError?: string
}

// 错误处理相关类型
export type ErrorCode =
  | 'TIMEOUT'
  | 'NETWORK_ERROR'
  | 'AUTH_FAILED'
  | 'RATE_LIMITED'
  | 'INVALID_REQUEST'
  | 'SERVER_ERROR'
  | 'PLATFORM_UNAVAILABLE'
  | 'PLATFORM_NOT_FOUND'
  | 'PROXY_ERROR'
  | 'VALIDATION_ERROR'

export interface ErrorDetails {
  /** 错误代码 */
  code: ErrorCode
  /** 错误消息 */
  message: string
  /** 平台标识 */
  platform?: string
  /** 账户ID */
  accountId?: string
  /** HTTP状态码 */
  httpStatus?: number
  /** 重试次数 */
  retryCount?: number
  /** 原始错误 */
  originalError?: any
  /** 错误时间戳 */
  timestamp: Date
}

export class ValidationError extends Error {
  constructor(
    message: string,
    public readonly field: string,
    public readonly value: any,
  ) {
    super(message)
    this.name = 'ValidationError'
  }
}

// 事件相关类型
export interface EventData {
  /** 事件ID */
  id: string
  /** 事件类型 */
  type: string
  /** 事件数据 */
  data: any
  /** 时间戳 */
  timestamp: Date
  /** 平台标识 */
  platform?: string
  /** 账户ID */
  accountId?: string
}

export interface EventSubscription {
  /** 订阅ID */
  id: string
  /** 事件类型 */
  eventType: string
  /** 回调函数 */
  callback: (event: EventData) => void
  /** 订阅时间 */
  subscribedAt: Date
  /** 是否活跃 */
  active: boolean
}

// 缓存相关类型
export interface CacheEntry<T = any> {
  /** 缓存键 */
  key: string
  /** 缓存值 */
  value: T
  /** 过期时间 */
  expiresAt: Date
  /** 创建时间 */
  createdAt: Date
  /** 访问次数 */
  accessCount: number
  /** 最后访问时间 */
  lastAccessedAt: Date
}

export interface CacheOptions {
  /** TTL（生存时间）毫秒 */
  ttl?: number
  /** 最大缓存条目数 */
  maxSize?: number
  /** 缓存策略 */
  strategy?: 'lru' | 'lfu' | 'ttl' | 'none'
  /** 是否启用 */
  enabled?: boolean
}

// 配置相关类型
export interface GlobalConfig {
  /** 默认超时配置 */
  defaultTimeout: {
    connect: number
    read: number
    write: number
  }
  /** 默认重试配置 */
  defaultRetry: {
    maxAttempts: number
    delay: number
    exponentialBackoff: boolean
  }
  /** 全局代理配置 */
  globalProxy?: ProxyConfiguration
  /** 日志配置 */
  logging: {
    level: 'debug' | 'info' | 'warn' | 'error'
    logSensitiveData: boolean
  }
  /** 性能监控配置 */
  monitoring: {
    enabled: boolean
    metricsRetention: number
    healthCheckInterval: number
  }
}

// 工具类型
export type DeepPartial<T> = {
  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]
}

export type RequiredFields<T, K extends keyof T> = T & Required<Pick<T, K>>

export type OptionalFields<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>

export type Awaitable<T> = T | Promise<T>

export type Constructor<T = {}> = new (...args: any[]) => T

export type EventEmitterLike = {
  on(event: string, listener: (...args: any[]) => void): void
  off(event: string, listener: (...args: any[]) => void): void
  emit(event: string, ...args: any[]): void
}

// 平台特定常量
export const SUPPORTED_PLATFORMS = ['pacifica', 'aster', 'binance'] as const
export type SupportedPlatform = (typeof SUPPORTED_PLATFORMS)[number]

export const AUTH_TYPES = ['ed25519', 'eip191', 'hmac-sha256', 'bearer', 'api-key'] as const
export type AuthType = (typeof AUTH_TYPES)[number]

export const PROXY_TYPES = ['http', 'https', 'socks4', 'socks5'] as const
export type ProxyType = (typeof PROXY_TYPES)[number]

// 默认配置常量
export const DEFAULT_TIMEOUT = {
  connect: 5000,
  read: 30000,
  write: 15000,
} as const

export const DEFAULT_RETRY = {
  maxAttempts: 3,
  delay: 1000,
  exponentialBackoff: true,
} as const

export const DEFAULT_RATE_LIMITS = {
  pacifica: { requestsPerSecond: 100, requestsPerMinute: 1200 },
  aster: { requestsPerSecond: 50, requestsPerMinute: 1000 },
  binance: { requestsPerSecond: 20, requestsPerMinute: 1200 },
} as const
