//go:build e2e

// Package testutil 提供 E2E 测试的工具函数。
//
// 包含 SSL/TLS 测试辅助函数。
//
// 作者：xfy
package testutil

import (
	"crypto/tls"
	"crypto/x509"
	"net/http"
	"os"
	"time"
)

// CreateTLSClient 创建信任指定证书的 HTTPS 客户端。
//
// 参数：
//   - certPath: CA 证书文件路径
//
// 返回配置好的 HTTP 客户端，信任指定的证书。
func CreateTLSClient(certPath string) (*http.Client, error) {
	caCert, err := os.ReadFile(certPath)
	if err != nil {
		return nil, err
	}

	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	return &http.Client{
		Timeout: DefaultClientTimeout,
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs: caCertPool,
			},
		},
	}, nil
}

// CreateTLSClientWithVersion 创建带版本限制的 HTTPS 客户端。
//
// 参数：
//   - certPath: CA 证书文件路径
//   - minVersion: 最小 TLS 版本
//   - maxVersion: 最大 TLS 版本
func CreateTLSClientWithVersion(certPath string, minVersion, maxVersion uint16) (*http.Client, error) {
	caCert, err := os.ReadFile(certPath)
	if err != nil {
		return nil, err
	}

	caCertPool := x509.NewCertPool()
	caCertPool.AppendCertsFromPEM(caCert)

	return &http.Client{
		Timeout: DefaultClientTimeout,
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				RootCAs:    caCertPool,
				MinVersion: minVersion,
				MaxVersion: maxVersion,
			},
		},
	}, nil
}

// CreateInsecureTLSClient 创建跳过证书验证的 HTTPS 客户端。
//
// 用于测试自签名证书场景，不应在生产环境使用。
func CreateInsecureTLSClient() *http.Client {
	return &http.Client{
		Timeout: DefaultClientTimeout,
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{
				InsecureSkipVerify: true,
			},
		},
	}
}

// CreateDefaultHTTPClient 创建默认 HTTP 客户端。
//
// 用于非 SSL 测试场景。
func CreateDefaultHTTPClient() *http.Client {
	return &http.Client{
		Timeout: DefaultClientTimeout,
	}
}

// CreateHTTPClientWithTimeout 创建带自定义超时的 HTTP 客户端。
func CreateHTTPClientWithTimeout(timeout time.Duration) *http.Client {
	return &http.Client{
		Timeout: timeout,
	}
}
