package client

import (
	"context"
	"os"
	"testing"

	. "github.com/pingcap/check"
)

var (
	cli *Client
)

func TestClient(t *testing.T) {
	TestingT(t)
}

var _ = Suite(&testUtilSuite{})

type testUtilSuite struct{}

func (t *testUtilSuite) TestDevClient(c *C) {
	cli = New(context.Background(), ModeDev)

	tidbServiceStr := "172.16.30.11:32333"
	tidbStr := "10.5.4.2:4000,10.5.4.3:4000"
	pdStr := "10.5.4.4:2379,10.5.4.5:2379,10.5.4.6:2379"
	tikvStr := "10.5.4.7:22334,10.5.4.8:22334,10.5.4.9:22334"

	if err := os.Setenv(tidbServiceEnv, tidbServiceStr); err != nil {
		c.Fatal(err)
	}

	if err := os.Setenv(tidbsEnv, tidbStr); err != nil {
		c.Fatal(err)
	}

	if err := os.Setenv(pdsEnv, pdStr); err != nil {
		c.Fatal(err)
	}

	if err := os.Setenv(tikvsEnv, tikvStr); err != nil {
		c.Fatal(err)
	}

	c.Assert(cli.TiDBService(), Equals, tidbServiceStr)
	c.Assert(cli.TiDBs(), DeepEquals, []string{"10.5.4.2:4000", "10.5.4.3:4000"})
	c.Assert(cli.PDs(), DeepEquals, []string{"10.5.4.4:2379", "10.5.4.5:2379", "10.5.4.6:2379"})
	c.Assert(cli.TiKVs(), DeepEquals, []string{"10.5.4.7:22334", "10.5.4.8:22334", "10.5.4.9:22334"})
}

func (t *testUtilSuite) TestDevModeOnlyTiDBService(c *C) {
	cli = New(context.Background(), ModeDev)

	os.Clearenv()

	tidbServiceStr := "172.16.30.11:32333"

	if err := os.Setenv(tidbServiceEnv, tidbServiceStr); err != nil {
		c.Fatal(err)
	}

	c.Assert(cli.TiDBService(), Equals, tidbServiceStr)
	c.Assert(len(cli.TiDBs()), Equals, 0)
	c.Assert(len(cli.PDs()), Equals, 0)
	c.Assert(len(cli.TiKVs()), Equals, 0)
}

func (t *testUtilSuite) TestCheckTiDBService(c *C) {
	c.Assert(checkTiDBService("127.0.0.1:4000"), IsNil)
	c.Assert(checkTiDBService(""), IsNil)
	c.Assert(checkTiDBService("127.0.0.1:"), ErrorMatches, "strconv.Atoi: parsing \"\": invalid syntax")
	c.Assert(checkTiDBService("127.0.0.1"), ErrorMatches, "tidb service 127.0.0.1 not valid")
}

func (t *testUtilSuite) TestGenIPsAndPorts(c *C) {
	ips, ports, err := genIPsAndPorts("")
	c.Assert(err, IsNil)
	c.Assert(len(ips), Equals, 0)
	c.Assert(len(ports), Equals, 0)

	ips, ports, err = genIPsAndPorts("10.5.4.2:4000,10.5.4.3:4000")
	c.Assert(err, IsNil)
	c.Assert(ips, DeepEquals, []string{"10.5.4.2", "10.5.4.3"})
	c.Assert(ports, DeepEquals, []int{4000, 4000})

	_, _, err = genIPsAndPorts("10.5.4.2:ss")
	c.Assert(err, ErrorMatches, "strconv.Atoi: parsing \"ss\": invalid syntax")

	_, _, err = genIPsAndPorts("10.5.4.2:")
	c.Assert(err, ErrorMatches, "strconv.Atoi: parsing \"\": invalid syntax")
}

func (t *testUtilSuite) TestgenMysqlName(c *C) {
	c.Assert(genMysqlName("5.6"), Equals, "mysql-5-6")
}
