//go:build integration
// +build integration

package integration_test

import (
	"database/sql"
	"fmt"
	"strings"
	"testing"

	"github.com/everything-on-mysql/cassandra-on-mysql/internal/config"
)

func TestCreateTableClusteredIndexSwitch(t *testing.T) {
	requireProxy(t)

	t.Run("default-nonclustered", func(t *testing.T) {
		session := newSession(t, sessionOptions{disableHostLookup: true})
		db, err := sql.Open("mysql", mysqlDSN(mysqlCfg))
		if err != nil {
			t.Fatalf("mysql connect failed: %v", err)
		}
		defer db.Close()

		keyspace := uniqueKeyspace()
		if err := session.Query(createKeyspaceCQL(keyspace)).Exec(); err != nil {
			t.Fatalf("create keyspace failed: %v", err)
		}
		t.Cleanup(func() {
			_ = session.Query(dropKeyspaceCQL(keyspace)).Exec()
		})

		table := "pk_nonclustered"
		create := fmt.Sprintf("CREATE TABLE %s.%s (id int PRIMARY KEY, name text)", keyspace, table)
		if err := session.Query(create).Exec(); err != nil {
			t.Fatalf("create table failed: %v", err)
		}
		ddl := fetchCreateTable(t, db, keyspace, table)
		if !strings.Contains(strings.ToUpper(ddl), "NONCLUSTERED") {
			t.Fatalf("expected NONCLUSTERED primary key, got: %s", ddl)
		}
	})

	t.Run("enabled-clustered", func(t *testing.T) {
		prevCfg := config.GetConfig()
		host, port, stop, err := startProxyWithConfig(mysqlCfg, func(cfg *config.Config) {
			cfg.MySQL.EnableClusteredIndex = true
		})
		if err != nil {
			config.SetConfig(prevCfg)
			t.Fatalf("start proxy with clustered index enabled failed: %v", err)
		}
		defer func() {
			stop()
			config.SetConfig(prevCfg)
		}()

		session := newSessionForProxy(t, host, port, sessionOptions{disableHostLookup: true})
		db, err := sql.Open("mysql", mysqlDSN(mysqlCfg))
		if err != nil {
			t.Fatalf("mysql connect failed: %v", err)
		}
		defer db.Close()

		keyspace := uniqueKeyspace()
		if err := session.Query(createKeyspaceCQL(keyspace)).Exec(); err != nil {
			t.Fatalf("create keyspace failed: %v", err)
		}
		t.Cleanup(func() {
			_ = session.Query(dropKeyspaceCQL(keyspace)).Exec()
		})

		table := "pk_clustered"
		create := fmt.Sprintf("CREATE TABLE %s.%s (id int PRIMARY KEY, name text)", keyspace, table)
		if err := session.Query(create).Exec(); err != nil {
			t.Fatalf("create table failed: %v", err)
		}
		ddl := fetchCreateTable(t, db, keyspace, table)
		if !strings.Contains(strings.ToUpper(ddl), "CLUSTERED") {
			t.Fatalf("expected CLUSTERED primary key, got: %s", ddl)
		}
		if strings.Contains(strings.ToUpper(ddl), "NONCLUSTERED") {
			t.Fatalf("expected clustered table not to contain NONCLUSTERED marker, got: %s", ddl)
		}
	})
}
