package packs

import (
	"fmt"

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

func (p *SourceBackedPack) precollectSourceBackedLayoutSearchMetadata(ordered []ManifestComponent, packObjectSpecs []ObjectSpec) error {
	if err := p.precollectSourceBackedRelatedListRules(ordered); err != nil {
		return err
	}
	if err := p.precollectSourceBackedSearchAllDefaultFields(ordered); err != nil {
		return err
	}
	if err := searchmetadata.ValidatePackSearchAllDefaultFields(p.searchAllDefaultFields); err != nil {
		return err
	}
	if err := searchmetadata.ValidatePackSearchAllDefaultFieldsOwnership(p.searchAllDefaultFields, objectSpecAPINames(packObjectSpecs)); err != nil {
		return err
	}
	if err := validateSearchAllDefaultFieldsForObjectSpecs(p.searchAllDefaultFields, packObjectSpecs); err != nil {
		return err
	}
	return validateSearchAllDefaultFieldsFallbackCoverageForObjectSpecs(p.searchAllDefaultFields, packObjectSpecs)
}

func (p *SourceBackedPack) precollectSourceBackedRelatedListRules(ordered []ManifestComponent) error {
	// Pre-collect every pack related_list_rule payload before the handler table
	// builds components. Topological sorting breaks ties by kind + business key,
	// so page_layout sorts before related_list_rule without an explicit edge.
	for _, component := range ordered {
		if component.Kind != ComponentKindRelatedListRule {
			continue
		}
		payload, err := sourceBackedComponentPayload(p.source, component)
		if err != nil {
			return fmt.Errorf("%s %s payload: %w", component.Kind, component.BusinessKey, err)
		}
		_, rules, err := newSourceBackedRelatedListRuleComponent(p.Name(), component, payload)
		if err != nil {
			return err
		}
		p.relatedListRules = append(p.relatedListRules, rules...)
	}
	return nil
}

func (p *SourceBackedPack) precollectSourceBackedSearchAllDefaultFields(ordered []ManifestComponent) error {
	for _, component := range ordered {
		if component.Kind != ComponentKindSearchAllDefaultFields {
			continue
		}
		payload, err := sourceBackedComponentPayload(p.source, component)
		if err != nil {
			return fmt.Errorf("%s %s payload: %w", component.Kind, component.BusinessKey, err)
		}
		_, declarations, err := newSourceBackedSearchAllDefaultFieldsComponent(p.Name(), component, payload)
		if err != nil {
			return err
		}
		p.searchAllDefaultFields = append(p.searchAllDefaultFields, declarations...)
	}
	return nil
}
