package models

import (
	"strings"

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

// IsPolymorphicReferenceField reports whether a field owns a server-managed
// discriminator. It delegates to ResolveFieldRelationshipSemantics with
// LifecyclePersistedRead so legacy lookup rows with explicit IsPolymorphic
// are correctly recognized.
func IsPolymorphicReferenceField(field *FieldMetadata) bool {
	if field == nil {
		return false
	}
	return ResolveFieldRelationshipSemantics(field, LifecyclePersistedRead).IsPolymorphic
}

// PolymorphicDiscriminatorParentForField returns the owning polymorphic
// reference field for a generated discriminator API name. Ordinary fields that
// merely end in "_type" return an empty string.
func PolymorphicDiscriminatorParentForField(fields []FieldMetadata, fieldAPIName string) string {
	fieldAPIName = strings.TrimSpace(fieldAPIName)
	if fieldAPIName == "" {
		return ""
	}
	for i := range fields {
		parent := &fields[i]
		if !IsPolymorphicReferenceField(parent) {
			continue
		}
		if strings.EqualFold(fieldAPIName, parent.APIName+constants.PolymorphicTypeSuffix) {
			return parent.APIName
		}
	}
	return ""
}

// RehydratePolymorphicDiscriminatorFields restores transient ownership and
// intrinsic read-only capabilities after schemas are loaded from _System_Field.
func RehydratePolymorphicDiscriminatorFields(schema *ObjectMetadata) {
	if schema == nil {
		return
	}
	for i := range schema.Fields {
		schema.Fields[i].GeneratedForPolymorphicReference = ""
	}
	for i := range schema.Fields {
		parent := PolymorphicDiscriminatorParentForField(schema.Fields, schema.Fields[i].APIName)
		if parent == "" {
			continue
		}
		schema.Fields[i].GeneratedForPolymorphicReference = parent
		schema.Fields[i].Createable = false
		schema.Fields[i].Updateable = false
	}
}
