package mysqlbackend

import (
	"context"
	"strings"
	"testing"
	"time"
)

func TestSchemaManagerCQLMetaCaseInsensitiveLookup(t *testing.T) {
	cache := NewCQLMetaCache(time.Minute)
	user := "user"
	password := "password"
	key := userKey{user: user, password: password}
	expires := time.Now().Add(time.Minute)

	keyspace := "ai"
	table := "Vector_index_f882947b_e67d_4eb3_8c9d_8649fcb115e2_Node"
	column := "id"

	tableInfo := CQLTableInfo{Keyspace: keyspace, Table: table}
	columnInfo := CQLColumnInfo{Keyspace: keyspace, Table: table, Name: column, CQLType: "text"}

	cache.mu.Lock()
	cache.tables[key] = cqlTableCacheEntry{
		expires:       expires,
		list:          []CQLTableInfo{tableInfo},
		bySchema:      map[string][]CQLTableInfo{keyspace: {tableInfo}},
		bySchemaLower: map[string][]CQLTableInfo{normalizeLookup(keyspace): {tableInfo}},
		available:     true,
	}
	cache.columns[key] = cqlColumnCacheEntry{
		expires:      expires,
		list:         []CQLColumnInfo{columnInfo},
		byTable:      map[tableKey][]CQLColumnInfo{{schema: keyspace, table: table}: {columnInfo}},
		byTableLower: map[tableKey][]CQLColumnInfo{normalizeTableKey(keyspace, table): {columnInfo}},
		available:    true,
	}
	cache.mu.Unlock()

	manager := &SchemaManager{metaCache: cache}
	ctx := context.Background()

	tables, available, err := manager.CQLTablesForKeyspace(ctx, user, password, strings.ToUpper(keyspace))
	if err != nil {
		t.Fatalf("CQLTablesForKeyspace err=%v", err)
	}
	if !available {
		t.Fatalf("CQLTablesForKeyspace available=false")
	}
	if len(tables) != 1 || tables[0].Table != table {
		t.Fatalf("CQLTablesForKeyspace unexpected tables: %#v", tables)
	}

	cols, available, err := manager.CQLColumnsForTable(ctx, user, password, keyspace, strings.ToLower(table))
	if err != nil {
		t.Fatalf("CQLColumnsForTable err=%v", err)
	}
	if !available {
		t.Fatalf("CQLColumnsForTable available=false")
	}
	if len(cols) != 1 || cols[0].Name != column {
		t.Fatalf("CQLColumnsForTable unexpected columns: %#v", cols)
	}
}
