package log

import (
	"fmt"
	"testing"

	"github.com/onsi/gomega"

	"github.com/pingcap-inc/clinic/pkg/config"
	"github.com/pingcap-inc/clinic/pkg/es"
	"github.com/pingcap-inc/clinic/pkg/importer/utils"
)

func Test_LogSink(t *testing.T) {
	g := gomega.NewWithT(t)

	clusterID := "123543567"
	orgID := uint(13377)

	cfg := config.LogConfig{
		Endpoint: fmt.Sprintf("http://%s:%d", "127.0.0.1", es.EsPort),
		//AddressConfig: config.AddressConfig{
		//	Host: "127.0.0.1",
		//	Port: es.EsPort,
		//},
		User:     "admin",
		Password: "admin",
		KibanaConfig: config.KibanaConfig{
			AddressConfig: config.AddressConfig{
				Host: "127.0.0.1",
				Port: es.KibanaPort,
			},
		},
	}
	sink, err := NewLogSink(cfg, orgID, 1635000000000, 1636000000000)
	g.Expect(err).To(gomega.Succeed())
	Host := "127.0.0.TestLogSink"

	prefix := fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log"))
	logs := []LogRecord{
		{
			Record:     "[2021/10/26 17:24:06.093 +08:00] [INFO] [server.go:194] [\"register REST path\"] [path=/pd/api/v1]",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(1111111111111)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "[2021/10/26 17:24:06.094 +08:00] [INFO] [etcd.go:117] [\"configuring peer listeners\"] [listen-peer-urls=\"[http://0.0.0.0:2380]\"]",
			Host:       Host,
			Component:  "tidb",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111112)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "tidb-4000",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
	}
	err = sink.Sink(logs)
	g.Expect(err).To(gomega.Succeed())

	g.Expect(sink.Close()).To(gomega.Succeed())

	g.Expect(err).To(gomega.Succeed())

	records := QueryESEventually(&ESQueryOption{
		ClusterID:  clusterID,
		Host:       Host,
		Component:  "pd",
		StartTime:  1635240046000,
		EndTime:    1635240346000,
		Level:      "info",
		InstanceID: "pd-2379",
		OrgID:      orgID,
	}, g, 1)

	g.Expect(len(records)).To(gomega.Equal(1))
	g.Expect(records[0].Message).To(gomega.Equal("[server.go:194] [\"register REST path\"] [path=/pd/api/v1]"))
}

func Test_UnExpectLog(t *testing.T) {
	g := gomega.NewWithT(t)

	clusterID := "123543567891"
	orgID := uint(1235435678917)

	cfg := config.LogConfig{
		Endpoint: fmt.Sprintf("http://%s:%d", "127.0.0.1", es.EsPort),
		//AddressConfig: config.AddressConfig{
		//	Host: "127.0.0.1",
		//	Port: es.EsPort,
		//},
		User:     "admin",
		Password: "admin",
		KibanaConfig: config.KibanaConfig{
			AddressConfig: config.AddressConfig{
				Host: "127.0.0.1",
				Port: es.KibanaPort,
			},
		},
	}
	sink, err := NewLogSink(cfg, orgID, 0, 1700000000000)
	g.Expect(err).To(gomega.Succeed())
	Host := "127.0.0.TestLogSink"

	prefix := fmt.Sprintf("%s-%s", utils.FnvHash("8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108"), utils.FnvHash("172.16.5.137/home/tiops/tidb-deploy/tidb-4000/log/tidb.log"))
	logs := []LogRecord{
		{
			Record:     "[2021/12/06 17:24:06.093 +08:00] [INFO] [server.go:194] [\"register REST path\"] [path=/pd/api/v1]",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111112)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "3452356261",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111113)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "3452356262",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111114)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "3452356263",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111115)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "[2021/12/06 17:25:06.093 +08:00] [INFO] [server.go:194] [\"register REST path\"] [path=/pd/api/v2]",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111116)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
		{
			Record:     "[2021/12/06 17:25:06.093 +08:00] [INFO] [server.go:194] [\"register REST path\"] [path=/pd/api/v3]",
			Host:       Host,
			Component:  "pd",
			RecordID:   fmt.Sprintf("%s-%d", prefix, int64(11111111111117)),
			PackageID:  "8df9e3075057432-2be068847b212ee7-a71cd20639ea6108-a71cd20639ea6108",
			InstanceID: "pd-2379",
			LogType:    standardType,
			ClusterID:  clusterID,
		},
	}
	err = sink.Sink(logs)
	g.Expect(err).To(gomega.Succeed())

	g.Expect(sink.Close()).To(gomega.Succeed())

	g.Expect(err).To(gomega.Succeed())

	records := QueryESEventually(&ESQueryOption{
		ClusterID:  clusterID,
		Host:       Host,
		Component:  "pd",
		StartTime:  1638696046000,
		EndTime:    1638796846000,
		Level:      "info",
		InstanceID: "pd-2379",
		OrgID:      orgID,
	}, g, 3)

	expectNormalLogs := []string{
		"[server.go:194] [\"register REST path\"] [path=/pd/api/v1]",
		"[server.go:194] [\"register REST path\"] [path=/pd/api/v2]",
		"[server.go:194] [\"register REST path\"] [path=/pd/api/v3]",
	}

	for i := 0; i < len(records); i++ {
		g.Expect(expectNormalLogs).To(gomega.ContainElement(records[i].Message))
	}

	errorRecords := QueryESEventually(&ESQueryOption{
		ClusterID:  clusterID,
		Host:       Host,
		Component:  "pd",
		StartTime:  1638696046000,
		EndTime:    1638796846000,
		Level:      "error",
		InstanceID: "pd-2379",
		OrgID:      orgID,
	}, g, 3)

	expectErrorLogs := []string{
		"3452356261",
		"3452356262",
		"3452356263",
	}

	for i := 0; i < len(records); i++ {
		g.Expect(expectErrorLogs).To(gomega.ContainElement(errorRecords[i].Message))
	}
}
