package bootstrapimpl

import (
	"testing"

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

func TestSystemTableGroupHasAuthoritativeUserRoleReference(t *testing.T) {
	defs := GetSystemTableDefinitions()
	group := findSystemTableForPolyTest(t, defs, "Group")
	userRoleID := findSystemColumnForPolyTest(t, group.Columns, "UserRoleId")

	if userRoleID.Type != "VARCHAR(255)" {
		t.Fatalf("Group.UserRoleId type = %q, want VARCHAR(255)", userRoleID.Type)
	}
	if !userRoleID.Nullable {
		t.Fatal("Group.UserRoleId must stay nullable for non-role-backed groups")
	}
	if userRoleID.LogicalType != string(constants.FieldTypeReference) {
		t.Fatalf("Group.UserRoleId logicalType = %q, want %q", userRoleID.LogicalType, constants.FieldTypeReference)
	}
	if !sameStringSlice(userRoleID.ReferenceTo, []string{"UserRole"}) {
		t.Fatalf("Group.UserRoleId referenceTo = %v, want [UserRole]", userRoleID.ReferenceTo)
	}
	assertGroupUserRoleForeignKey(t, group.ForeignKeys)
}

func assertGroupUserRoleForeignKey(t *testing.T, fks []schema.ForeignKeyDefinition) {
	t.Helper()
	for _, fk := range fks {
		if fk.Column != "UserRoleId" {
			continue
		}
		if fk.References != "UserRole(Id)" {
			t.Fatalf("Group.UserRoleId foreign key references = %q, want UserRole(Id)", fk.References)
		}
		if fk.OnDelete != "RESTRICT" {
			t.Fatalf("Group.UserRoleId foreign key onDelete = %q, want RESTRICT", fk.OnDelete)
		}
		return
	}
	t.Fatal("Group.UserRoleId foreign key missing")
}
