package runtimeapi

import (
	"context"
	"errors"

	"github.com/pingcap-inc/nexuscrm-controlplane/catalogread"
)

// CatalogServingSource adapts the Catalog-owned, statement-consistent serving
// tuple without copying Catalog SQL or retaining a second binding registry in
// Runtime.
func CatalogServingSource(reader *catalogread.Reader) (ServingCatalogSource, error) {
	if reader == nil {
		return nil, errors.New("runtime serving state: Catalog read facade is required")
	}
	return func(ctx context.Context, installationID, capabilityID string) (ServingInstallation, ServingHandlerBinding, bool, error) {
		capability, err := reader.ReadServingCapability(ctx, installationID, capabilityID)
		if errors.Is(err, catalogread.ErrNotFound) {
			return ServingInstallation{}, ServingHandlerBinding{}, false, nil
		}
		if err != nil {
			return ServingInstallation{}, ServingHandlerBinding{}, false, err
		}
		return ServingInstallation{
				OrgID: capability.Installation.OrgID, AppInstallationID: capability.Installation.AppInstallationID,
				ActiveReleaseDigest: capability.Installation.ActiveReleaseDigest, CatalogRevision: capability.Installation.CatalogRevision,
			}, ServingHandlerBinding{
				OrgID: capability.Binding.OrgID, AppInstallationID: capability.Binding.AppInstallationID,
				AppReleaseDigest: capability.Binding.AppReleaseDigest, CapabilityID: capability.Binding.CapabilityID,
				WorkloadID: capability.Binding.WorkloadID, ServiceReleaseDigest: capability.Binding.ServiceReleaseDigest,
				OwnershipEpoch: capability.Binding.OwnershipEpoch, CompatibilityReceiptDigest: capability.Binding.CompatibilityReceiptDigest,
			}, true, nil
	}, nil
}
