package common

import (
	"fmt"
	"math/rand"
	"os"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestPlacementRule(t *testing.T) {
	var srcRules PlacementRules
	for i := 0; i < 10; i++ {
		for j := 0; j < 3; j++ {
			id := fmt.Sprintf("keyspace-%d-table-%d-r", i, j)
			if rand.Int()%2 == 1 {
				id = fmt.Sprintf("id-%d", i)
			}
			rule := &PlacementRule{
				GroupID:     fmt.Sprintf("groupID%d", i),
				ID:          id,
				Index:       i,
				Override:    true,
				StartKeyHex: fmt.Sprintf("startKeyHex%d", i),
				EndKeyHex:   fmt.Sprintf("endKeyHex%d", i),
				Role:        "follower",
				Count:       i,
			}
			srcRules = append(srcRules, rule)
		}
	}

	f, err := os.OpenFile("./test_placement_rules.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
	require.NoError(t, err)
	err = srcRules.WriteTo(f)
	require.NoError(t, err)
	err = f.Close()
	require.NoError(t, err)

	f, err = os.OpenFile("./test_placement_rules.txt", os.O_RDONLY, 0666)
	require.NoError(t, err)
	var readRules PlacementRules
	err = readRules.ReadFrom(f)
	require.NoError(t, err)

	require.Equal(t, srcRules, readRules)
	err = f.Close()
	require.NoError(t, err)

	f, err = os.OpenFile("./test_placement_rules.txt", os.O_RDONLY, 0666)
	require.NoError(t, err)
	// CachePlacementRules only return keyspace rules
	ksRules, err := CachePlacementRules(f)
	require.NoError(t, err)

	srcKSRuleCount, cachedKSRuleCount := 0, 0
	for _, rule := range srcRules {
		if strings.HasPrefix(rule.ID, "keyspace") {
			id, err := GetKsIdFromPlacementRule(rule.ID)
			require.NoError(t, err)
			require.Contains(t, ksRules[id], rule)
			srcKSRuleCount++
		}
	}
	for _, rules := range ksRules {
		cachedKSRuleCount += len(rules)
	}
	require.Equal(t, srcKSRuleCount, cachedKSRuleCount)

	// remove file
	err = os.Remove("./test_placement_rules.txt")
	require.NoError(t, err)
}
