package doppel

import (
	"context"
	"net"
	"net/http"
	"time"

	"github.com/9seconds/mtg/v2/essentials"
	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
)

const (
	// Please see Stats description
	// https://blog.cloudflare.com/optimizing-tls-over-tcp-to-reduce-latency/
	// https://github.com/cloudflare/sslconfig/blob/master/patches/nginx__dynamic_tls_records.patch
	TLSRecordSizeStart = 1450
	TLSRecordSizeAccel = 4096
	TLSRecordSizeMax   = 16384 - tls.SizeHeader

	TLSCounterAccelAfter = 40
	TLSCounterMaxAfter   = TLSCounterAccelAfter + 20

	TLSRecordSizeResetAfter = time.Second
)

// copypasted from mtglib
type Network interface {
	// Dial establishes context-free TCP connections.
	Dial(network, address string) (essentials.Conn, error)

	// DialContext dials using a context. This is a preferable way of
	// establishing TCP connections.
	DialContext(ctx context.Context, network, address string) (essentials.Conn, error)

	// MakeHTTPClient build an HTTP client with given dial function. If nothing is
	// provided, then DialContext of this interface is going to be used.
	MakeHTTPClient(func(ctx context.Context, network, address string) (essentials.Conn, error)) *http.Client

	// NativeDialer returns a configured instance of native dialer that
	// skips proxy connections or any other irrelevant settings.
	NativeDialer() *net.Dialer
}
