//go:build integration
// +build integration

package integration_test

import (
	"fmt"
	"testing"

	"github.com/everything-on-mysql/cassandra-on-mysql/pkg/cql"
)

func TestCounterTableConstraints(t *testing.T) {
	session := newSession(t, sessionOptions{disableHostLookup: true})

	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()
	})

	invalidPK := fmt.Sprintf("CREATE TABLE %s.pk_counter (id counter PRIMARY KEY, cnt counter)", keyspace)
	requireErrorCode(t, session.Query(invalidPK).Exec(), cql.ErrorCodeInvalid)

	invalidMix := fmt.Sprintf("CREATE TABLE %s.mixed_counter (id int PRIMARY KEY, cnt counter, name text)", keyspace)
	requireErrorCode(t, session.Query(invalidMix).Exec(), cql.ErrorCodeInvalid)

	counterTable := fmt.Sprintf("CREATE TABLE %s.counter_table (id int PRIMARY KEY, cnt counter)", keyspace)
	if err := session.Query(counterTable).Exec(); err != nil {
		t.Fatalf("create counter table failed: %v", err)
	}

	insertCounter := fmt.Sprintf("INSERT INTO %s.counter_table (id) VALUES (1)", keyspace)
	requireErrorCode(t, session.Query(insertCounter).Exec(), cql.ErrorCodeInvalid)

	nonCounter := fmt.Sprintf("CREATE TABLE %s.standard_table (id int PRIMARY KEY, name text)", keyspace)
	if err := session.Query(nonCounter).Exec(); err != nil {
		t.Fatalf("create standard table failed: %v", err)
	}

	addCounter := fmt.Sprintf("ALTER TABLE %s.standard_table ADD cnt counter", keyspace)
	requireErrorCode(t, session.Query(addCounter).Exec(), cql.ErrorCodeInvalid)

	addNonCounter := fmt.Sprintf("ALTER TABLE %s.counter_table ADD name text", keyspace)
	requireErrorCode(t, session.Query(addNonCounter).Exec(), cql.ErrorCodeInvalid)
}
