package schema

import (
	"strings"
	"testing"
)

func TestFSLayerEventIDSchemaKeeps64BytePrimaryKey(t *testing.T) {
	for _, test := range []struct {
		name       string
		statements []string
		primaryKey []string
	}{
		{name: "standalone", statements: FSLayerTiDBSchemaStatements(), primaryKey: []string{"event_id"}},
		{name: "shared", statements: FSLayerTiDBSharedSchemaStatements(), primaryKey: []string{"fs_id", "event_id"}},
	} {
		t.Run(test.name, func(t *testing.T) {
			spec, err := tidbSchemaSpecFromStatements(test.statements)
			if err != nil {
				t.Fatalf("tidbSchemaSpecFromStatements: %v", err)
			}
			table := mustTableSpecFromSchemaSpec(t, spec, "fs_layer_events")
			eventID := table.columns["event_id"]
			if eventID.columnType != "varchar(64)" {
				t.Fatalf("event_id column type=%q, want varchar(64)", eventID.columnType)
			}
			if !equalStringSlices(table.primaryKey.columns, test.primaryKey) {
				t.Fatalf("primary key columns=%#v, want %#v", table.primaryKey.columns, test.primaryKey)
			}
		})
	}
}

func TestFSLayerEventIDPrimaryKeyTypeChangeIsNotAutoRepaired(t *testing.T) {
	diff := tidbSchemaDiff{
		kind:       tidbSchemaDiffColumnType,
		tableName:  "fs_layer_events",
		columnName: "event_id",
		repairSQL:  "ALTER TABLE fs_layer_events MODIFY COLUMN event_id VARCHAR(128) NOT NULL",
	}
	if repairs := plannedTiDBSchemaRepairs([]tidbSchemaDiff{diff}); len(repairs) != 0 {
		t.Fatalf("planned repairs=%#v, want none for TiDB primary-key type change", repairs)
	}
}

func TestFSLayerDB9SchemaKeeps64ByteEventID(t *testing.T) {
	var createFound bool
	for _, statement := range FSLayerDB9SchemaStatements() {
		normalized := normalizeSQLFragment(statement)
		if strings.HasPrefix(normalized, "create table if not exists fs_layer_events ") && strings.Contains(normalized, "event_id varchar(64) primary key") {
			createFound = true
		}
		if strings.Contains(normalized, "alter table") && strings.Contains(normalized, "fs_layer_events") && strings.Contains(normalized, "event_id") {
			t.Fatalf("unexpected DB9 event_id migration: %s", statement)
		}
	}
	if !createFound {
		t.Fatal("db9 fs_layer_events create statement does not use VARCHAR(64) PRIMARY KEY")
	}
}
