package persistence

import (
	"testing"

	"github.com/nexuscrm/kernel/pkg/schema"
)

func TestManagedPhysicalSchemaEvolutionRequiresCanonicalCatalogIntent(t *testing.T) {
	legacy := schema.TableDefinition{
		TableName: connectorV2ReceiptAdmissionKeyTable,
		Indices: []schema.IndexDefinition{{
			Name:    connectorV2ReceiptTransportIndex,
			Unique:  true,
			Columns: append([]string(nil), connectorV2ReceiptLegacyTransportIdentityColumns...),
		}},
	}
	if declaresConnectorV2ReceiptTransportIdentity(legacy) {
		t.Fatal("legacy catalog definition must not authorize its own migration")
	}
	canonical := legacy
	canonical.Indices = []schema.IndexDefinition{{
		Name:    connectorV2ReceiptTransportIndex,
		Unique:  true,
		Columns: append([]string(nil), connectorV2ReceiptTransportIdentityColumns...),
	}}
	if !declaresConnectorV2ReceiptTransportIdentity(canonical) {
		t.Fatal("canonical catalog definition must authorize the managed migration")
	}

	legacyReceipt := schema.TableDefinition{
		TableName: connectorV2ReceiptTable,
		Columns: []schema.ColumnDefinition{{
			Name:          connectorV2ReceiptProtocolColumn,
			Type:          "VARCHAR(255)",
			CollationName: "utf8mb4_bin",
		}},
	}
	if declaresConnectorV2ReceiptAccountIndex(legacyReceipt) {
		t.Fatal("receipt definition without the account index must not authorize migration")
	}
	if declaresConnectorV2ReceiptProtocolWidth(legacyReceipt) {
		t.Fatal("legacy receipt protocol width must not authorize canonical migration")
	}
	canonicalReceipt := legacyReceipt
	canonicalReceipt.Columns = append([]schema.ColumnDefinition(nil), legacyReceipt.Columns...)
	canonicalReceipt.Columns[0].Type = "VARCHAR(32)"
	canonicalReceipt.Indices = []schema.IndexDefinition{{
		Name:    connectorV2ReceiptAccountIndex,
		Columns: append([]string(nil), connectorV2ReceiptAccountIndexColumns...),
	}}
	if !declaresConnectorV2ReceiptAccountIndex(canonicalReceipt) {
		t.Fatal("canonical receipt account index must authorize managed migration")
	}
	if !declaresConnectorV2ReceiptProtocolWidth(canonicalReceipt) {
		t.Fatal("canonical receipt protocol width must authorize managed migration")
	}
}
