package executor

import (
	"testing"

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

func TestParseInsertDuplicateIncrementColumns(t *testing.T) {
	set := parseInsertDuplicateIncrementColumns([]string{
		"ks.tbl.unread_count",
		" KS.TBL.UNREAD_COUNT ",
		"invalid",
		"ks.tbl.",
	})
	if len(set) != 1 {
		t.Fatalf("expected one valid increment column, got %#v", set)
	}
	if _, ok := set["ks.tbl.unread_count"]; !ok {
		t.Fatalf("expected normalized key ks.tbl.unread_count")
	}
}

func TestShouldInsertDuplicateIncrementRespectsProtocolMode(t *testing.T) {
	table := &parser.TableName{Schema: "ks", Name: "tbl"}

	strict := &Executor{
		protocolMode:              config.ExecutorProtocolModeStrictCassandra,
		insertDuplicateIncrements: map[string]struct{}{"ks.tbl.unread_count": {}},
	}
	if strict.shouldInsertDuplicateIncrement(table, "unread_count") {
		t.Fatalf("strict mode should not enable increment upsert")
	}

	extended := &Executor{
		protocolMode:              config.ExecutorProtocolModeExtendedSQL,
		insertDuplicateIncrements: map[string]struct{}{"ks.tbl.unread_count": {}},
	}
	if !extended.shouldInsertDuplicateIncrement(table, "unread_count") {
		t.Fatalf("extended mode should enable configured increment upsert")
	}
	if extended.shouldInsertDuplicateIncrement(table, "other") {
		t.Fatalf("unexpected increment upsert for non-configured column")
	}
}
