package conf

type Options struct {
	ListenIP    string      `yaml:"ListenIP"`
	SendIP      string      `yaml:"SendIP"`
	LimitConfig LimitConfig `yaml:"LimitConfig"`
	CertConfig  *CertConfig `yaml:"CertConfig"`
	XrayOptions XrayOptions `yaml:"XrayOptions"`
	HyOptions   HyOptions   `yaml:"HyOptions"`
	SingOptions SingOptions `yaml:"SingOptions"`
}

type XrayOptions struct {
	EnableProxyProtocol bool                    `yaml:"EnableProxyProtocol"`
	EnableDNS           bool                    `yaml:"EnableDNS"`
	DNSType             string                  `yaml:"DNSType"`
	EnableUot           bool                    `yaml:"EnableUot"`
	EnableTFO           bool                    `yaml:"EnableTFO"`
	DisableIVCheck      bool                    `yaml:"DisableIVCheck"`
	DisableSniffing     bool                    `yaml:"DisableSniffing"`
	EnableFallback      bool                    `yaml:"EnableFallback"`
	FallBackConfigs     []FallBackConfigForXray `yaml:"FallBackConfigs"`
}

type SingOptions struct {
	EnableProxyProtocol      bool                   `yaml:"EnableProxyProtocol"`
	TCPFastOpen              bool                   `yaml:"EnableTFO"`
	SniffEnabled             bool                   `yaml:"EnableSniff"`
	SniffOverrideDestination bool                   `yaml:"SniffOverrideDestination"`
	FallBackConfigs          *FallBackConfigForSing `yaml:"FallBackConfigs"`
}

type FallBackConfigForXray struct {
	SNI              string `yaml:"SNI"`
	Alpn             string `yaml:"Alpn"`
	Path             string `yaml:"Path"`
	Dest             string `yaml:"Dest"`
	ProxyProtocolVer uint64 `yaml:"ProxyProtocolVer"`
}

type FallBackConfigForSing struct {
	// sing-box
	FallBack        FallBack            `yaml:"FallBack"`
	FallBackForALPN map[string]FallBack `yaml:"FallBackForALPN"`
}
type FallBack struct {
	Server     string `yaml:"Server"`
	ServerPort string `yaml:"ServerPort"`
}

type HyOptions struct {
	Resolver          string `yaml:"Resolver"`
	ResolvePreference string `yaml:"ResolvePreference"`
	SendDevice        string `yaml:"SendDevice"`
}