package executor

import (
	"strings"
	"testing"

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

func TestValidateCreateTableExtensionsStrictModeRejectsDefaults(t *testing.T) {
	stmt := mustParseStatement(t, "CREATE TABLE ks.tbl (id int PRIMARY KEY, created_at timestamp DEFAULT current_timestamp)")
	createStmt, ok := stmt.(*parser.CreateTableStatement)
	if !ok {
		t.Fatalf("expected create table statement, got %T", stmt)
	}
	exec := &Executor{protocolMode: config.ExecutorProtocolModeStrictCassandra}
	err := exec.validateCreateTableExtensions(createStmt)
	if err == nil {
		t.Fatalf("expected strict mode to reject defaults")
	}
	if !strings.Contains(err.Error(), config.ExecutorProtocolModeExtendedSQL) {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestValidateCreateTableExtensionsExtendedModeAllowsTimestampDefaults(t *testing.T) {
	stmt := mustParseStatement(t, "CREATE TABLE ks.tbl (id int PRIMARY KEY, created_at timestamp DEFAULT current_timestamp, updated_at timestamp ON UPDATE now())")
	createStmt, ok := stmt.(*parser.CreateTableStatement)
	if !ok {
		t.Fatalf("expected create table statement, got %T", stmt)
	}
	exec := &Executor{protocolMode: config.ExecutorProtocolModeExtendedSQL}
	if err := exec.validateCreateTableExtensions(createStmt); err != nil {
		t.Fatalf("expected extension validation to pass, got %v", err)
	}
}

func TestValidateCreateTableExtensionsExtendedModeRejectsColumnRefDefault(t *testing.T) {
	stmt := mustParseStatement(t, "CREATE TABLE ks.tbl (id int PRIMARY KEY, v int DEFAULT other_col)")
	createStmt, ok := stmt.(*parser.CreateTableStatement)
	if !ok {
		t.Fatalf("expected create table statement, got %T", stmt)
	}
	exec := &Executor{protocolMode: config.ExecutorProtocolModeExtendedSQL}
	if err := exec.validateCreateTableExtensions(createStmt); err == nil {
		t.Fatalf("expected invalid default expression error")
	}
}
