package steam

import (
	"math/rand"
	"time"

	"github.com/Philipp15b/go-steam/netutil"
)

// CMServers contains a list of worlwide servers
var CMServers = [][]string{
	{ // North American Servers
		// Chicago
		"162.254.193.44:27018",
		"162.254.193.44:27019",
		"162.254.193.44:27020",
		"162.254.193.44:27021",
		"162.254.193.45:27017",
		"162.254.193.45:27018",
		"162.254.193.45:27019",
		"162.254.193.45:27021",
		"162.254.193.46:27017",
		"162.254.193.46:27018",
		"162.254.193.46:27019",
		"162.254.193.46:27020",
		"162.254.193.46:27021",
		"162.254.193.47:27019",
		"162.254.193.47:27020",

		// Ashburn
		"208.78.164.9:27017",
		"208.78.164.9:27018",
		"208.78.164.9:27019",
		"208.78.164.10:27017",
		"208.78.164.10:27018",
		"208.78.164.10:27019",
		"208.78.164.11:27017",
		"208.78.164.11:27018",
		"208.78.164.11:27019",
		"208.78.164.12:27017",
		"208.78.164.12:27018",
		"208.78.164.12:27019",
		"208.78.164.13:27017",
		"208.78.164.13:27018",
		"208.78.164.13:27019",
		"208.78.164.14:27017",
		"208.78.164.14:27018",
		"208.78.164.14:27019",
	},
	{ // Europe Servers
		// Luxembourg
		"146.66.152.10:27017",
		"146.66.152.10:27018",
		"146.66.152.10:27019",
		"146.66.152.10:27020",
		"146.66.152.11:27017",
		"146.66.152.11:27018",
		"146.66.152.11:27019",
		"146.66.152.11:27020",

		// Poland
		"155.133.242.8:27017",
		"155.133.242.8:27018",
		"155.133.242.8:27019",
		"155.133.242.8:27020",
		"155.133.242.9:27017",
		"155.133.242.9:27018",
		"155.133.242.9:27019",
		"155.133.242.9:27020",

		// Vienna
		"146.66.155.8:27017",
		"146.66.155.8:27018",
		"146.66.155.8:27019",
		"146.66.155.8:27020",
		"185.25.182.10:27017",
		"185.25.182.10:27018",
		"185.25.182.10:27019",
		"185.25.182.10:27020",

		// London
		"162.254.196.40:27017",
		"162.254.196.40:27018",
		"162.254.196.40:27019",
		"162.254.196.40:27020",
		"162.254.196.40:27021",
		"162.254.196.41:27017",
		"162.254.196.41:27018",
		"162.254.196.41:27019",
		"162.254.196.41:27020",
		"162.254.196.41:27021",
		"162.254.196.42:27017",
		"162.254.196.42:27018",
		"162.254.196.42:27019",
		"162.254.196.42:27020",
		"162.254.196.42:27021",
		"162.254.196.43:27017",
		"162.254.196.43:27018",
		"162.254.196.43:27019",
		"162.254.196.43:27020",
		"162.254.196.43:27021",

		// Stockholm
		"185.25.180.14:27017",
		"185.25.180.14:27018",
		"185.25.180.14:27019",
		"185.25.180.14:27020",
		"185.25.180.15:27017",
		"185.25.180.15:27018",
		"185.25.180.15:27019",
		"185.25.180.15:27020",
	},
}

// GetRandomCM returns back a random server anywhere
func GetRandomCM() *netutil.PortAddr {
	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
	servers := append(CMServers[0], CMServers[1]...)
	addr := netutil.ParsePortAddr(servers[rng.Int31n(int32(len(servers)))])
	if addr == nil {
		panic("invalid address in CMServers slice")
	}
	return addr
}

// GetRandomNorthAmericaCM returns back a random server in north america
func GetRandomNorthAmericaCM() *netutil.PortAddr {
	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
	addr := netutil.ParsePortAddr(CMServers[0][rng.Int31n(int32(len(CMServers[0])))])
	if addr == nil {
		panic("invalid address in CMServers slice")
	}
	return addr
}

// GetRandomEuropeCM returns back a random server in europe
func GetRandomEuropeCM() *netutil.PortAddr {
	rng := rand.New(rand.NewSource(time.Now().UnixNano()))
	addr := netutil.ParsePortAddr(CMServers[1][rng.Int31n(int32(len(CMServers[1])))])
	if addr == nil {
		panic("invalid address in CMServers slice")
	}
	return addr
}