package service

import "net/http"

// HTTPUpstream 上游 HTTP 请求接口
// 用于向上游 API（Claude、OpenAI、Gemini 等）发送请求
// 这是一个通用接口，可用于任何基于 HTTP 的上游服务
//
// 设计说明：
// - 支持可选代理配置
// - 支持账户级连接池隔离
// - 实现类负责连接池管理和复用
// - 支持可选的 TLS 指纹伪装
type HTTPUpstream interface {
	// Do 执行 HTTP 请求
	//
	// 参数:
	//   - req: HTTP 请求对象，由调用方构建
	//   - proxyURL: 代理服务器地址，空字符串表示直连
	//   - accountID: 账户 ID，用于连接池隔离（隔离策略为 account 或 account_proxy 时生效）
	//   - accountConcurrency: 账户并发限制，用于动态调整连接池大小
	//
	// 返回:
	//   - *http.Response: HTTP 响应，调用方必须关闭 Body
	//   - error: 请求错误（网络错误、超时等）
	//
	// 注意:
	//   - 调用方必须关闭 resp.Body，否则会导致连接泄漏
	//   - 响应体可能已被包装以跟踪请求生命周期
	Do(req *http.Request, proxyURL string, accountID int64, accountConcurrency int) (*http.Response, error)

	// DoWithTLS 执行带 TLS 指纹伪装的 HTTP 请求
	//
	// 参数:
	//   - req: HTTP 请求对象，由调用方构建
	//   - proxyURL: 代理服务器地址，空字符串表示直连
	//   - accountID: 账户 ID，用于连接池隔离和 TLS 指纹模板选择
	//   - accountConcurrency: 账户并发限制，用于动态调整连接池大小
	//   - enableTLSFingerprint: 是否启用 TLS 指纹伪装
	//
	// 返回:
	//   - *http.Response: HTTP 响应，调用方必须关闭 Body
	//   - error: 请求错误（网络错误、超时等）
	//
	// TLS 指纹说明:
	//   - 当 enableTLSFingerprint=true 时，使用 utls 库模拟 Claude CLI 的 TLS 指纹
	//   - TLS 指纹模板根据 accountID % len(profiles) 自动选择
	//   - 支持直连、HTTP/HTTPS 代理、SOCKS5 代理三种场景
	//   - 如果 enableTLSFingerprint=false，行为与 Do 方法相同
	//
	// 注意:
	//   - 调用方必须关闭 resp.Body，否则会导致连接泄漏
	//   - TLS 指纹客户端与普通客户端使用不同的缓存键，互不影响
	DoWithTLS(req *http.Request, proxyURL string, accountID int64, accountConcurrency int, enableTLSFingerprint bool) (*http.Response, error)
}
