package cat

import (
	"fmt"
	"testing"

	. "github.com/pingcap/check"
	"github.com/pingcap/schrodinger/config"
	"github.com/pingcap/schrodinger/pkg/types"
)

var (
	ct       *types.CatProcess
	pdConfig = types.ComponentConfig{
		Version: types.VersionInfo{
			Type:     "hash",
			Value:    "1234567890",
			Platform: "centos",
		},
		Size: 1,
		ResourceConfig: types.ResourceRequirements{
			Requests: &types.ResourceRequirement{
				CPU:    types.PDRequestCPUCount,
				Memory: types.PDRequestMemoryCount,
			},
			Limits: &types.ResourceRequirement{
				CPU:    types.PDLimitCPUCount,
				Memory: types.PDLimitMemoryCount,
			},
		},
	}
	tidbConfig = types.ComponentConfig{
		Version: types.VersionInfo{
			Type:     "hash",
			Value:    "1234567890",
			Platform: "centos",
		},
		Size: 3,
		ResourceConfig: types.ResourceRequirements{
			Requests: &types.ResourceRequirement{
				CPU:    types.TiDBRequestCPUCount,
				Memory: types.TiDBRequestMemoryCount,
			},
			Limits: &types.ResourceRequirement{
				CPU:    types.TiDBLimitCPUCount,
				Memory: types.TiDBLimitMemoryCount,
			},
		},
	}
	tikvConfig = types.ComponentConfig{
		Version: types.VersionInfo{
			Type:     "hash",
			Value:    "1234567890",
			Platform: "centos",
		},
		Size: 5,
		ResourceConfig: types.ResourceRequirements{
			Requests: &types.ResourceRequirement{
				CPU:    types.TiKVRequestCPUCount,
				Memory: types.TiKVRequestMemoryCount,
			},
			Limits: &types.ResourceRequirement{
				CPU:    types.TiKVLimitCPUCount,
				Memory: types.TiKVLimitMemoryCount,
			},
		},
	}
)

func TestClient(t *testing.T) {
	ct = &types.CatProcess{
		Meta: &types.Meta{},
		Config: types.TiDBClusterConfig{
			PDConfig:   pdConfig,
			TiDBConfig: tidbConfig,
			TiKVConfig: tikvConfig,
		},
		RunVersion: types.RunVersion{
			PDVersion:   pdConfig.Version,
			TiDBVersion: tidbConfig.Version,
			TiKVVersion: tikvConfig.Version,
		},
	}
	TestingT(t)
}

var _ = Suite(&testUtilSuite{})

type testUtilSuite struct{}

// func (t *testUtilSuite) TestgetClusterSpec(c *C) {
// 	labels := make(map[string]map[string]string)
// 	la := make(map[string]string)
// 	labels["pd"] = util.MapCopy(la)
// 	labels["tidb"] = util.MapCopy(la)
// 	labels["tikv"] = util.MapCopy(la)
// 	labels["monitor"] = util.MapCopy(la)
// 	cluster := getClusterSpec(ct, labels)
//
// 	c.Assert(cluster.TidbCluster.Spec.TiDB.Replicas, Equals, int32(5))
// 	c.Assert(cluster.TidbCluster.Spec.TiDB.Image, Equals, getImage("tidb", ct.RunVersion.TiDBVersion))
// }

func (t *testUtilSuite) TestgetNodeLabels(c *C) {
	l := &types.Meta{
		Labels: map[string]string{"node": "test", "node2": "test2"},
	}
	l1 := getNodeLabels(l)
	l2 := map[string]string{"node": "test"}
	c.Assert(l1, DeepEquals, l2)
}

func (t *testUtilSuite) TestgetServices(c *C) {
	// services := getServices()
	// services2 := []v1alpha1.Service{{Name: "pd", Type: "NodePort"}, {Name: "tidb", Type: "NodePort"}, {Name: "prometheus", Type: "NodePort"}, {Name: "grafana", Type: "NodePort"}}
	// c.Assert(services, DeepEquals, services2)
}

func (t *testUtilSuite) TestgetImage(c *C) {
	image := getImage("tidb", tidbConfig.Version, false)
	c.Assert(fmt.Sprintf("%s/%s:%s", config.GetGlobalConfig().Image.DockerhubPrefix, "tidb", "1234567-centos"), Equals, image)
}

func (t *testUtilSuite) TestgetTag(c *C) {
	tag := getTag(tidbConfig.Version, false)
	tag2 := "1234567-centos"
	c.Assert(tag, Equals, tag2)
}
