package config

import (
	"testing"

	"github.com/onsi/gomega"
)

func Test_InitConfig(t *testing.T) {
	cfg := `
allow-max-data-range: 777
importers:
- name: node1
  host: 127.0.0.1
  port: 1
- name: node2
  host: 127.0.0.2
  port: 2
server:
  addr: 0.0.0.0:7777
  list-files-limit: 20
  trusted-ca-file: ca.crt
  cert-file: cert.crt
  key-file: cert-key.crt
  accounts:
    users:
      - name: test-user1
        password: test-pwd1
      - name: test-user2
        password: test-pwd2
    admins:
      - name: admin-user1
        password: admin-pwd1
      - name: admin-user2
        password: admin-pwd2
sink:
  metric:
    host: 127.0.0.1
    port: 8480
    select-addr:
      op:
        host: 127.0.0.1
        port: 8481
        vm-cluster-mode: true
      cloud:
        host: 127.0.0.2
        port: 18481
        vm-cluster-mode: false
    default-account-id: 0
    grafana:
      host: 127.0.0.1
      port: 3001
  log:
    endpoint: http://127.0.0.1:9200
    kibana:
      host: 127.0.0.1
      port: 5601
db:
  user: root
  host: 127.0.0.1
  port: 4000
file-storage:
  aws:
    access-key: mykey
    secret-key: mysecret
external-feature-gates:
  orgs:
    all: false
    enabledOrgs: [60178]
`
	g := gomega.NewGomegaWithT(t)
	config, err := initConfig([]byte(cfg))
	g.Expect(err).To(gomega.Succeed())

	g.Expect(config.ServerConfig.Addr).To(gomega.Equal("0.0.0.0:7777"))
	g.Expect(config.ServerConfig.ListFilesLimit).To(gomega.Equal(20))
	g.Expect(config.ServerConfig.TrustedCAFile).To(gomega.Equal("ca.crt"))
	g.Expect(config.ServerConfig.CertFile).To(gomega.Equal("cert.crt"))
	g.Expect(config.ServerConfig.KeyFile).To(gomega.Equal("cert-key.crt"))
	g.Expect(config.GetAllowMaxDataRange()).To(gomega.Equal(int64(777)))
	g.Expect(len(config.ServerConfig.Accounts.Users)).To(gomega.Equal(2))
	g.Expect(config.ServerConfig.Accounts.Users[0].Name).To(gomega.Equal("test-user1"))
	g.Expect(config.ServerConfig.Accounts.Users[0].Password).To(gomega.Equal("test-pwd1"))
	g.Expect(config.ServerConfig.Accounts.Users[1].Name).To(gomega.Equal("test-user2"))
	g.Expect(config.ServerConfig.Accounts.Users[1].Password).To(gomega.Equal("test-pwd2"))
	g.Expect(config.ServerConfig.Accounts.Admins[0].Name).To(gomega.Equal("admin-user1"))
	g.Expect(config.ServerConfig.Accounts.Admins[0].Password).To(gomega.Equal("admin-pwd1"))
	g.Expect(config.ServerConfig.Accounts.Admins[1].Name).To(gomega.Equal("admin-user2"))
	g.Expect(config.ServerConfig.Accounts.Admins[1].Password).To(gomega.Equal("admin-pwd2"))

	g.Expect(config.DBConfig.User).To(gomega.Equal("root"))
	g.Expect(config.DBConfig.Host).To(gomega.Equal("127.0.0.1"))
	g.Expect(config.DBConfig.Port).To(gomega.Equal(uint16(4000)))
	g.Expect(config.DBConfig.Password).To(gomega.Equal(""))

	g.Expect(config.SinkConfig.MetricConfig.Host).To(gomega.Equal("127.0.0.1"))
	g.Expect(config.SinkConfig.MetricConfig.Port).To(gomega.Equal(uint16(8480)))
	g.Expect(config.SinkConfig.MetricConfig.InVMCluster()).To(gomega.Equal(false))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.OpAddress.Host).To(gomega.Equal("127.0.0.1"))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.OpAddress.Port).To(gomega.Equal(uint16(8481)))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.OpAddress.InVMCluster()).To(gomega.Equal(true))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.CloudAddress.Host).To(gomega.Equal("127.0.0.2"))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.CloudAddress.Port).To(gomega.Equal(uint16(18481)))
	g.Expect(config.SinkConfig.MetricConfig.SelectAddr.CloudAddress.InVMCluster()).To(gomega.Equal(false))
	g.Expect(config.SinkConfig.MetricConfig.DefaultAccountId).To(gomega.Equal(uint32(0)))

	// g.Expect(config.SinkConfig.MetricConfig.GrafanaConfig.Host).To(gomega.Equal("127.0.0.1"))
	// g.Expect(config.SinkConfig.MetricConfig.GrafanaConfig.Port).To(gomega.Equal(uint16(3001)))

	g.Expect(config.SinkConfig.LogConfig.Endpoint).To(gomega.Equal("http://127.0.0.1:9200"))

	g.Expect(config.SinkConfig.LogConfig.KibanaConfig.Host).To(gomega.Equal("127.0.0.1"))
	g.Expect(config.SinkConfig.LogConfig.KibanaConfig.Port).To(gomega.Equal(uint16(5601)))

	g.Expect(config.FileStorage.AWSStorage.AccessKey).To(gomega.Equal("mykey"))
	g.Expect(config.FileStorage.AWSStorage.SecretKey).To(gomega.Equal("mysecret"))

	//for i := 0; i < 100; i++ {
	//	if i%2 == 0 {
	//		g.Expect(config.DispathImporter(i)).To(gomega.Equal("127.0.0.1:1"))
	//	} else {
	//		g.Expect(config.DispathImporter(i)).To(gomega.Equal("127.0.0.2:2"))
	//	}
	//}

	g.Expect(config.ServerConfig.Host == "").To(gomega.BeTrue())

	g.Expect(config.ExternalFeatureGates.FeatureEnabled("orgs", uint64(1))).To(gomega.BeFalse())
	g.Expect(config.ExternalFeatureGates.FeatureEnabled("orgs", uint64(60178))).To(gomega.BeTrue())
}

func TestConfigGetAllowMaxDataRangeDefault(t *testing.T) {
	g := gomega.NewGomegaWithT(t)

	g.Expect((&Config{}).GetAllowMaxDataRange()).To(gomega.Equal(DefaultAllowMaxDataRange))
	g.Expect((*Config)(nil).GetAllowMaxDataRange()).To(gomega.Equal(DefaultAllowMaxDataRange))
}

func TestAddressConfigAuthority(t *testing.T) {
	g := gomega.NewGomegaWithT(t)
	{
		cfg := AddressConfig{
			Host: "localhost",
			Port: 80,
		}
		g.Expect(cfg.Authority()).To(gomega.Equal("localhost:80"))
	}
	{
		cfg := AddressConfig{
			Host: "localhost",
		}
		g.Expect(cfg.Authority()).To(gomega.Equal("localhost"))
	}
}

// func TestO11yCanaryFilter(t *testing.T) {
// 	g := gomega.NewGomegaWithT(t)
// 	cfg := CentralO11yConfig{
// 		EnableDedicatedRegions: "us-west-2,ap-northeast-2",
// 		EnableDevTierRegions:   "us-east-1,ap-northeast-1",
// 	}
// 	filter := cfg.CanaryFilter()
// 	g.Expect(filter.IsEnable("us-west1", "dedicated")).To(gomega.BeFalse())
// 	g.Expect(filter.IsEnable("us-west1", "shared")).To(gomega.BeFalse())
// 	g.Expect(filter.IsEnable("us-east-1", "dedicated")).To(gomega.BeFalse())
// 	g.Expect(filter.IsEnable("us-east-1", "shared")).To(gomega.BeTrue())
// 	g.Expect(filter.IsEnable("us-west-2", "dedicated")).To(gomega.BeTrue())
// 	g.Expect(filter.IsEnable("us-west-2", "shared")).To(gomega.BeFalse())
// 	g.Expect(filter.IsEnable("ap-northeast-1", "dedicated")).To(gomega.BeFalse())
// 	g.Expect(filter.IsEnable("ap-northeast-1", "shared")).To(gomega.BeTrue())
// 	g.Expect(filter.IsEnable("ap-northeast-2", "dedicated")).To(gomega.BeTrue())
// 	g.Expect(filter.IsEnable("ap-northeast-2", "shared")).To(gomega.BeFalse())
// }
