package cql

import (
	"net"
	"testing"

	"github.com/everything-on-mysql/cassandra-on-mysql/pkg/metrics"
	"go.uber.org/zap"
)

func TestServerMetricConnectionStats(t *testing.T) {
	metrics.SetClusterIDProviderForTest(nil)

	server := NewServer("127.0.0.1:0", nil, zap.NewNop(), nil)
	serverConn1, clientConn1 := net.Pipe()
	defer clientConn1.Close()
	conn1 := NewConn(serverConn1, server)
	conn1.SetUsername("ks.user")
	conn1.stateMu.Lock()
	conn1.startupComplete = true
	conn1.stateMu.Unlock()

	serverConn2, clientConn2 := net.Pipe()
	defer clientConn2.Close()
	conn2 := NewConn(serverConn2, server)

	server.mu.Lock()
	server.connections["conn-1"] = conn1
	server.connections["conn-2"] = conn2
	server.mu.Unlock()
	defer conn1.Close()
	defer conn2.Close()

	stats := server.MetricConnectionStats()
	foundAllKS := false
	foundActiveKS := false
	foundAllUnknown := false
	for _, stat := range stats {
		switch {
		case stat.Scope == "all" && stat.KeyspaceName == "ks" && stat.ClusterID == "-1":
			foundAllKS = stat.Count == 1
		case stat.Scope == "active" && stat.KeyspaceName == "ks" && stat.ClusterID == "-1":
			foundActiveKS = stat.Count == 1
		case stat.Scope == "all" && stat.KeyspaceName == "unknown" && stat.ClusterID == "-1":
			foundAllUnknown = stat.Count == 1
		}
	}
	if !foundAllKS || !foundActiveKS || !foundAllUnknown {
		t.Fatalf("unexpected connection stats: %+v", stats)
	}
}
