package runtimeapi

import (
	"context"
	"errors"
	"fmt"

	"github.com/nexuscrm/metadata/catalogsnapshot"
)

// deploymentReceipt proves the immutable deployment input. Its artifacts are
// retained for the deployment lifetime; only the live Catalog tuple can select
// the currently served publication. An anchor never grants current authority.
func (s *ServingState) deploymentReceipt(ctx context.Context, selection ServingSelection, artifacts *servingArtifactSet) (*catalogsnapshot.ServingCompatibilityReceipt, error) {
	receipt, err := artifacts.receipt(ctx, selection.ExpectedCompatibilityReceiptDigest)
	if err != nil {
		return nil, fmt.Errorf("runtime serving state: load deployment receipt: %w", err)
	}
	if receipt.Digest() != selection.ExpectedCompatibilityReceiptDigest ||
		receipt.OrgID() != selection.OrgID || receipt.AppInstallationID() != selection.AppInstallationID ||
		receipt.AppCapabilityID() != selection.AppCapabilityID || receipt.RuntimeCapabilityID() != selection.RuntimeCapabilityID ||
		receipt.WorkloadID() != selection.ExpectedWorkloadID || receipt.ServiceReleaseDigest() != selection.ExpectedServiceReleaseDigest ||
		receipt.OwnershipEpoch() != selection.ExpectedOwnershipEpoch {
		return nil, errors.New("runtime serving state: deployment receipt does not match selection")
	}
	snapshot, err := artifacts.snapshot(ctx, receipt.CatalogSnapshotDigest())
	if err != nil {
		return nil, fmt.Errorf("runtime serving state: load deployment snapshot: %w", err)
	}
	view, err := artifacts.view(ctx, receipt.RuntimeMetadataViewDigest())
	if err != nil {
		return nil, fmt.Errorf("runtime serving state: load deployment view: %w", err)
	}
	if snapshot.Digest() != receipt.CatalogSnapshotDigest() || snapshot.OrgID() != selection.OrgID ||
		view.Digest() != receipt.RuntimeMetadataViewDigest() || view.OrgID() != selection.OrgID ||
		view.AppInstallationID() != selection.AppInstallationID || view.CapabilityID() != selection.RuntimeCapabilityID ||
		view.Lineage() != receipt.Lineage() || artifacts.verifySource(view, snapshot) != nil ||
		view.VerifyCompatibility(selection.LocalCompatibility) != nil || validateServingView(selection.RuntimeCapabilityID, view) != nil {
		return nil, errors.New("runtime serving state: deployment artifacts are inconsistent or incompatible")
	}
	return receipt, nil
}
