package metadata

// RelatedListResolution provides runtime resolution metadata for virtual related
// lists whose display identity differs from their query/navigation targets.
// This is a runtime-only contract — never persisted into layout config.
type RelatedListResolution struct {
	Query  ResolvedQueryTarget  `json:"query"`
	Detail ResolvedDetailTarget `json:"detail"`
	List   ResolvedListTarget   `json:"list"`
	Create ResolvedCreateTarget `json:"create"`
}

// ResolvedQueryTarget is the SObject + lookup field used for COUNT and SELECT queries.
type ResolvedQueryTarget struct {
	ObjectApiName      string `json:"objectApiName"`
	LookupField        string `json:"lookupField"`
	ParentFieldApiName string `json:"parentFieldApiName,omitempty"`
}

// ResolvedDetailTarget is the SObject used when navigating to a record detail page.
type ResolvedDetailTarget struct {
	ObjectApiName string `json:"objectApiName"`
}

// ResolvedListTarget is the SObject + filter field used for "View All" navigation.
type ResolvedListTarget struct {
	ObjectApiName      string `json:"objectApiName"`
	FilterField        string `json:"filterField"`
	ParentFieldApiName string `json:"parentFieldApiName,omitempty"`
}

// ResolvedCreateTarget describes the "New" button behavior.
// Kind: "standard" (record creation form), "upload" (file upload), "none" (hide button).
type ResolvedCreateTarget struct {
	Kind            string            `json:"kind"`                      // "standard" | "upload" | "none"
	ObjectApiName   string            `json:"objectApiName,omitempty"`   // target object for "standard" create
	PrefillMappings map[string]string `json:"prefillMappings,omitempty"` // targetField -> parent/source field
}

// ResolveVirtualRelatedList returns the runtime resolution metadata for a virtual
// related list identified by its display identity (objectApiName + lookupField).
// Returns nil for non-virtual related lists — callers should fall back to the
// display identity in that case.
func ResolveVirtualRelatedList(objectApiName, lookupField string) *RelatedListResolution {
	displayIdentity := relatedListDisplayIdentity(objectApiName, lookupField)
	for _, rule := range snapshotRelatedListRules() {
		if relatedListDisplayIdentity(rule.ChildObjectAPI, rule.LookupField) != displayIdentity {
			continue
		}
		if rule.Resolution == nil {
			return nil
		}
		resolution := *rule.Resolution
		if len(rule.Resolution.Create.PrefillMappings) > 0 {
			resolution.Create.PrefillMappings = make(map[string]string, len(rule.Resolution.Create.PrefillMappings))
			for k, v := range rule.Resolution.Create.PrefillMappings {
				resolution.Create.PrefillMappings[k] = v
			}
		}
		return &resolution
	}
	return nil
}
