package log

import (
	"archive/tar"
	"bytes"
	"fmt"
	"os"
	"testing"

	"github.com/onsi/gomega"
	"github.com/pingcap/log"
	"go.uber.org/zap"

	"github.com/pingcap-inc/clinic/pkg/cluster"
)

// TODO
func Test_ImportLogs(t *testing.T) {
}

func newLogTarReader(insertCount int) (*tar.Reader, error) {
	var logs string
	for i := 0; i < insertCount; i++ {
		logs += fmt.Sprintf("[2021/10/26 17:24:06.093 +08:00] [INFO] [server.go:194%d] [\"register REST path\"] [path=/pd/api/v1]\n", i)
	}

	var buf bytes.Buffer
	tw := tar.NewWriter(&buf)

	files := []string{
		"172.16.5.137/chj/app/tidb/deploy/tidb-4000/log/tidb.log",
		"172.21.58.64/chj/app/tidb/deploy/tikv-20160/log/tikv.log",
		"172.21.49.84/chj/app/tidb/deploy/tidb-4000/log/pd.log",
		"172.21.58.87/chj/app/tidb/deploy/tiflash-9000/log/tiflash.log",
	}

	fdata := []byte(logs)
	for _, f := range files {
		hdr := &tar.Header{
			Name: f,
			Mode: 0o600,
			Size: int64(len(fdata)),
		}
		if err := tw.WriteHeader(hdr); err != nil {
			log.Error("write header failed", zap.Error(err))
			return nil, err
		}
		if _, err := tw.Write(fdata); err != nil {
			log.Error("write failed", zap.Error(err))
			return nil, err
		}
	}
	// write slow query log content
	slowQueryLogFile := "172.16.5.137/chj/app/tidb/deploy/tidb-4000/log/tidb_slow_query.log"
	slowQueryBuf, err := os.ReadFile("../testdata/172.16.5.137/chj/app/tidb/deploy/tidb-4000/log/tidb_slow_query.log")
	if err != nil {
		return nil, err
	}
	hdr := &tar.Header{
		Name: slowQueryLogFile,
		Mode: 0o600,
		Size: int64(len(slowQueryBuf)),
	}
	if err := tw.WriteHeader(hdr); err != nil {
		log.Error("write header failed", zap.Error(err))
		return nil, err
	}
	if _, err := tw.Write(slowQueryBuf); err != nil {
		log.Error("write failed", zap.Error(err))
		return nil, err
	}
	if err := tw.Close(); err != nil {
		log.Error("close failed", zap.Error(err))
		return nil, err
	}

	return tar.NewReader(&buf), nil
}

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

	clusterInfo, err := TestClusterJSON("../testdata/cluster.json")
	g.Expect(err).To(gomega.Succeed())

	opt, isLogFile := IsLogFile("172.21.58.87/chj/app/tidb/deploy/tiflash-9000/log/tiflash_tikv.log", "tiflash_tikv.log", cluster.NewImportComponentsMeta(clusterInfo))

	g.Expect(isLogFile).To(gomega.BeTrue())
	g.Expect(opt.host).To(gomega.Equal("172.21.58.87"))
	g.Expect(opt.component).To(gomega.Equal("tiflash"))
	g.Expect(opt.instanceID).To(gomega.Equal("tiflash-9000"))
	g.Expect(opt.logType).To(gomega.Equal(standardType))
}

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

	cj, err := TestClusterJSON("../testdata/cluster.json")
	g.Expect(err).To(gomega.Succeed())

	meta := cluster.NewImportComponentsMeta(cj)

	opt, isLog := IsLogFile("172.21.58.88/chj/app/tidb/deploy/tiflash-9000/log/tiflash_tikv.log.2021-11-03-11:10:52.071331361", "tiflash_tikv.log.2021-11-03-11:10:52.071331361", meta)

	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(opt.instanceID).To(gomega.Equal("tiflash-9000"))

	opt2, isLogFile2 := IsLogFile("172.21.49.84/chj/app/tidb/deploy/tidb-4000/log/tidb.log", "tidb.log", meta)
	g.Expect(isLogFile2).To(gomega.BeTrue())
	g.Expect(opt2.instanceID).To(gomega.Equal("tidb-4000"))

	opt2, isLogFile2 = IsLogFile("172.21.58.65/chj/app/tidb/deploy/tikv-20160/log/tikv.log.2021-11-03-15:28:39.717848851", "tikv.log.2021-11-03-15:28:39.717848851", meta)
	g.Expect(isLogFile2).To(gomega.BeTrue())
	g.Expect(opt2.instanceID).To(gomega.Equal("tikv-20160"))

	_, isLogFile2 = IsLogFile("10.27.5.149/data3/pd/log/pd.log", "pd.log", meta)
	g.Expect(isLogFile2).To(gomega.BeFalse())
	// g.Expect(opt2.instanceID).To(gomega.Equal("pd"))

	opt2, isLogFile2 = IsLogFile("172.21.49.84/chj/app/tidb/deploy/pd-2379/log/pd.log", "pd.log", meta)
	g.Expect(isLogFile2).To(gomega.BeTrue())
	g.Expect(opt2.instanceID).To(gomega.Equal("pd-2379"))
	g.Expect(opt2.component).To(gomega.Equal("pd"))
}
