package template

import (
	"testing"
	"time"

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

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

var _ = Suite(&testUtilSuite{})

type testUtilSuite struct{}

func (t *testUtilSuite) TestGenerateReport(c *C) {
	test1 := &types.TestReport{
		Name:    "ddl",
		Status:  types.TestStateFailed,
		LogPath: "http://172.16.4.4:30750/goto/5902ab4027cf8000660a32623c63a72e",
		Log:     "new schrodinger",
	}
	test2 := &types.TestReport{
		Name:    "xx",
		Status:  types.TestStateStopped,
		LogPath: "http://172.16.4.4:30750/goto/5902ab4027cf8000660a32623c63a72e",
		Log:     "new schrodinger 2",
	}
	cat := &types.CatReport{
		Cluster: &types.ClusterReport{
			NodeIP: []string{"1.2.3.4"},
			PrometheusService: types.Service{
				NodeIP:       []string{"1.2.3.4"},
				NodePort:     343,
				ClusterIP:    "2.34.5.6",
				ClusterPort:  344,
				ExternalIP:   "33.4.5.6",
				ExternalPort: 345,
			},
			TidbService: types.Service{
				NodeIP:       []string{"1.2.3.4"},
				NodePort:     343,
				ClusterIP:    "2.34.5.6",
				ClusterPort:  344,
				ExternalIP:   "33.4.5.6",
				ExternalPort: 345,
			},
			PdService: types.Service{
				ClusterIP:   "2.34.5.6",
				ClusterPort: 344,
			},
			GrafanaService: types.Service{
				NodeIP:       []string{"1.2.3.4"},
				NodePort:     343,
				ClusterIP:    "2.34.5.6",
				ClusterPort:  344,
				ExternalIP:   "33.4.5.6",
				ExternalPort: 345,
			},
		},
	}
	var queryResults []*types.QueryResult
	queryResults = append(queryResults, &types.QueryResult{
		Query: "sql1",
		Cost:  5 * time.Second,
		Diff:  float64(-0.2333333),
	})
	var testResults types.TestResults

	testResults = append(testResults, &types.TestResult{
		QPS:          float64(5000),
		EPS:          float64(0),
		AvgMs:        float64(45.3555666),
		Pct90:        float64(89),
		Pct99:        float64(89),
		QPSDiff:      float64(0.325544),
		EPSDiff:      float64(0.333333),
		AvgMsDiff:    float64(0.325544),
		Pct90Diff:    float64(0.325544),
		Pct99Diff:    float64(0.325544),
		QueryResults: queryResults,
	})

	report := &types.ExperimentReport{
		Stage: types.ExperimentStageRunning,
		State: types.ExperimentStateAbnormal,
		Config: types.TiDBClusterConfig{
			PDConfig: types.ComponentConfig{
				Version: types.VersionInfo{
					Type:     "branch",
					Value:    "master",
					Platform: "",
				},
				Size: 1,
			},
			TiDBConfig: types.ComponentConfig{
				Version: types.VersionInfo{
					Type:     "branch",
					Value:    "master",
					Platform: "",
				},
				Size: 3,
			},
			TiKVConfig: types.ComponentConfig{
				Version: types.VersionInfo{
					Type:     "branch",
					Value:    "master",
					Platform: "",
				},
				Size: 5,
			},
		},
		RunVersion: types.RunVersion{
			PDVersion: types.VersionInfo{
				Type:     "hash",
				Value:    "a1234567",
				Platform: "",
			},
			TiDBVersion: types.VersionInfo{
				Type:     "hash",
				Value:    "a2345677",
				Platform: "centos7",
			},
			TiKVVersion: types.VersionInfo{
				Type:     "hash",
				Value:    "a3456789",
				Platform: "centos7",
			},
		},
		Cat:         cat,
		TestResults: testResults,
	}
	report.Tests = append(report.Tests, test1)
	report.Tests = append(report.Tests, test2)

	rp, err := GenerateReport(BriefReportTemplateName, BriefReportTemplate, report)
	c.Log(rp)
	c.Assert(err, IsNil)
	c.Assert(rp == "", Equals, false)

	drp, err := GenerateReport(DetailReportTemplateName, GenDetailReportTemplate(), report)
	c.Log(drp)
	c.Assert(err, IsNil)
	c.Assert(drp == "", Equals, false)

	rp, err = GenerateReport(BenchReportTemplateName, BenchReportTemplate, report)
	c.Log(rp)
	c.Assert(err, IsNil)
	c.Assert(rp == "", Equals, false)
}
