package cluster

import (
	"io"
	"os"
	"testing"

	"github.com/onsi/gomega"
	"github.com/pingcap/diag/pkg/models"
)

func Test_ClusterInfo(t *testing.T) {
	g := gomega.NewWithT(t)
	f, err := os.Open("testdata/cluster.json")
	g.Expect(err).To(gomega.Succeed())
	data, err := io.ReadAll(f)
	g.Expect(err).To(gomega.Succeed())
	info, err := NewImportComponentsMetaWithByte(data)
	g.Expect(err).To(gomega.Succeed())
	g.Expect(info.isNewVersion).To(gomega.Equal(false))

	meta, isLog := info.IsLog("172.21.49.83/chj/app/tidb/deploy/pd-2379/log/pd.log")
	g.Expect(isLog).To(gomega.BeTrue())

	g.Expect(meta.Instance).To(gomega.Equal("pd-2379"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
	g.Expect(meta.Component).To(gomega.Equal(PDComponent))
	meta, isLog = info.IsLog("/172.21.49.83/chj/app/tidb/deploy/pd-2379/log/pd.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Instance).To(gomega.Equal("pd-2379"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
	g.Expect(meta.Component).To(gomega.Equal(PDComponent))
	meta, isConf := info.IsConf("172.21.49.83/chj/app/tidb/deploy/pd-2379/conf/config.json")
	g.Expect(isConf).To(gomega.BeTrue())
	g.Expect(meta.Instance).To(gomega.Equal("pd-2379"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
	g.Expect(meta.Component).To(gomega.Equal(PDComponent))

	meta, isLog = info.IsLog("172.21.58.64/chj/app/tidb/deploy/tikv-20160/log/tikv.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Instance).To(gomega.Equal("tikv-20160"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
	g.Expect(meta.Component).To(gomega.Equal(TiKVComponent))
	meta, isLog = info.IsLog("/172.21.58.64/chj/app/tidb/deploy/tikv-20160/log/tikv.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Instance).To(gomega.Equal("tikv-20160"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
	g.Expect(meta.Component).To(gomega.Equal(TiKVComponent))
	meta, isConf = info.IsConf("172.21.58.64/chj/app/tidb/deploy/tikv-20160/conf/config.json")
	g.Expect(isConf).To(gomega.BeTrue())
	g.Expect(meta.Instance).To(gomega.Equal("tikv-20160"))
	g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
	g.Expect(meta.Component).To(gomega.Equal(TiKVComponent))

	// meta, isLog = info.IsConf("172.21.58.64/chj/app/tidb/deploy/tikv-20160/log")
	// g.Expect(isLog).To(gomega.BeTrue())
	// g.Expect(meta.Instance).To(gomega.Equal("tikv-20160"))
	// g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
	// g.Expect(meta.Component).To(gomega.Equal("tikv"))
	// meta, isConf = info.IsConf("172.21.58.64/chj/app/tidb/deploy/tikv-20160/conf")
	// g.Expect(isConf).To(gomega.BeTrue())
	// g.Expect(meta.Instance).To(gomega.Equal("tikv-20160"))
	// g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
	// g.Expect(meta.Component).To(gomega.Equal("tikv"))
	/*
		meta, isLog = info.IsLog("172.21.49.83/chj/app/tidb/deploy/tidb-4000/log/pd.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tidb-4000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
		g.Expect(meta.Component).To(gomega.Equal(TiDBComponent))
		meta, isLog = info.IsLog("/172.21.49.83/chj/app/tidb/deploy/tidb-4000/log/pd.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tidb-4000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
		g.Expect(meta.Component).To(gomega.Equal(TiDBComponent))
		meta, isConf = info.IsConf("172.21.49.83/chj/app/tidb/deploy/tidb-4000/conf/tidb.json")
		g.Expect(isConf).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tidb-4000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.49.83"))
		g.Expect(meta.Component).To(gomega.Equal(TiDBComponent))

		meta, isLog = info.IsLog("172.21.58.87/chj/app/tidb/deploy/tiflash-9000/log/tiflash.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tiflash-9000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.87"))
		g.Expect(meta.Component).To(gomega.Equal(TiFlashComponent))
		meta, isLog = info.IsLog("/172.21.58.87/chj/app/tidb/deploy/tiflash-9000/log/tiflash.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tiflash-9000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.87"))
		g.Expect(meta.Component).To(gomega.Equal(TiFlashComponent))
		meta, isConf = info.IsConf("172.21.58.87/chj/app/tidb/deploy/tiflash-9000/conf/tiflash.json")
		g.Expect(isConf).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("tiflash-9000"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.87"))
		g.Expect(meta.Component).To(gomega.Equal(TiFlashComponent))

		meta, isLog = info.IsLog("172.21.58.64/chj/app/tidb/deploy/cdc-8300/log/cdc.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("ticdc-8300"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
		g.Expect(meta.Component).To(gomega.Equal(TiCDCComponent))
		meta, isLog = info.IsLog("/172.21.58.64/chj/app/tidb/deploy/cdc-8300/log/cdc.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("ticdc-8300"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
		g.Expect(meta.Component).To(gomega.Equal(TiCDCComponent))
		meta, isConf = info.IsConf("172.21.58.64/chj/app/tidb/deploy/cdc-8300/conf/cdc.json")
		g.Expect(isConf).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("ticdc-8300"))
		g.Expect(meta.Host).To(gomega.Equal("172.21.58.64"))
		g.Expect(meta.Component).To(gomega.Equal(TiCDCComponent))

		meta, isLog = info.IsLog("192.168.122.215/home/tidb/dm/deploy/dm-master-8261/log/dm-master.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("dm-master-8261"))
		g.Expect(meta.Host).To(gomega.Equal("192.168.122.215"))
		g.Expect(meta.Component).To(gomega.Equal(DMMasterComponent))

		meta, isLog = info.IsLog("192.168.122.25/home/tidb/dm/deploy/dm-worker-8262/log/dm-master.log")
		g.Expect(isLog).To(gomega.BeTrue())
		g.Expect(meta.Instance).To(gomega.Equal("dm-worker-8262"))
		g.Expect(meta.Host).To(gomega.Equal("192.168.122.25"))
		g.Expect(meta.Component).To(gomega.Equal(DMWorkerComponent))
	*/
}

func Test_ClusterInfo2(t *testing.T) {
	g := gomega.NewWithT(t)
	f, err := os.Open("testdata/cluster2.json")
	g.Expect(err).To(gomega.Succeed())
	data, err := io.ReadAll(f)
	g.Expect(err).To(gomega.Succeed())
	info, err := NewImportComponentsMetaWithByte(data)
	g.Expect(err).To(gomega.Succeed())
	_, isLog := info.IsLog("cluster.json")
	g.Expect(isLog).To(gomega.BeFalse())
}

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

	spec := models.ComponentSpec{
		Host: "127.0.0.1",
		Port: 111,
		Attributes: map[string]any{
			"log_dir":    "",
			"deploy_dir": "/a/b/c/d",
		},
	}

	g.Expect(getLogPath(spec)).To(gomega.Equal("127.0.0.1/a/b/c/d/log"))
}

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

	spec := models.ComponentSpec{
		Host: "127.0.0.1",
		Port: 111,
		Attributes: map[string]any{
			"log_dir":    "log",
			"deploy_dir": "/a/b/c/d",
		},
	}

	g.Expect(getLogPath(spec)).To(gomega.Equal("127.0.0.1/a/b/c/d/log"))
}

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

	spec := models.ComponentSpec{
		Host: "127.0.0.1",
		Port: 111,
		Attributes: map[string]any{
			"log_dir":    "/log",
			"deploy_dir": "/a/b/c/d",
		},
	}

	g.Expect(getLogPath(spec)).To(gomega.Equal("127.0.0.1/log"))
}

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

	spec := models.ComponentSpec{
		Host: "127.0.0.1",
		Port: 111,
		Attributes: map[string]any{
			"log_dir":    "/a/b/c/d/log",
			"deploy_dir": "/a/b/c/d",
		},
	}

	g.Expect(getLogPath(spec)).To(gomega.Equal("127.0.0.1/a/b/c/d/log"))
}

func Test_ClusterInfo3(t *testing.T) {
	g := gomega.NewWithT(t)
	f, err := os.Open("testdata/cluster3.json")
	g.Expect(err).To(gomega.Succeed())
	data, err := io.ReadAll(f)
	g.Expect(err).To(gomega.Succeed())
	info, err := NewImportComponentsMetaWithByte(data)
	g.Expect(err).To(gomega.Succeed())

	meta, isLog := info.IsLog("172.30.210.236/data2/tidb/log/tikv-20172/tikv.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Component).To(gomega.Equal(TiKVComponent))
}

func Test_ClusterInfoUnknownComponent(t *testing.T) {
	g := gomega.NewWithT(t)
	f, err := os.Open("testdata/cluster4.json")
	g.Expect(err).To(gomega.Succeed())
	data, err := io.ReadAll(f)
	g.Expect(err).To(gomega.Succeed())
	info, err := NewImportComponentsMetaWithByte(data)
	g.Expect(err).To(gomega.Succeed())

	meta, isLog := info.IsLog("10.203.178.97/data/deploy/log/pd.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Component).To(gomega.Equal(UnKnownComponent))

	meta, isLog = info.IsLog("10.203.178.97/data/deploy/log/tidb.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Component).To(gomega.Equal(UnKnownComponent))

	meta, isLog = info.IsLog("10.203.178.95/data/deploy/pd-2379/log/pd.log")
	g.Expect(isLog).To(gomega.BeTrue())
	g.Expect(meta.Component).To(gomega.Equal(PDComponent))
}
