package obfs

import (
	"errors"
	"fmt"
	"net"
)

var (
	errTLS12TicketAuthIncorrectMagicNumber = errors.New("tls1.2_ticket_auth incorrect magic number")
	errTLS12TicketAuthTooShortData         = errors.New("tls1.2_ticket_auth too short data")
	errTLS12TicketAuthHMACError            = errors.New("tls1.2_ticket_auth hmac verifying failed")
)

type authData struct {
	clientID [32]byte
}

type Obfs interface {
	StreamConn(net.Conn) net.Conn
}

type obfsCreator func(b *Base) Obfs

var obfsList = make(map[string]struct {
	overhead int
	new      obfsCreator
})

func register(name string, c obfsCreator, o int) {
	obfsList[name] = struct {
		overhead int
		new      obfsCreator
	}{overhead: o, new: c}
}

func PickObfs(name string, b *Base) (Obfs, int, error) {
	if choice, ok := obfsList[name]; ok {
		return choice.new(b), choice.overhead, nil
	}
	return nil, 0, fmt.Errorf("Obfs %s not supported", name)
}