package controlplane

import (
	"context"
	"encoding/json"
	"fmt"

	"github.com/nexuscrm/kernel/pkg/formula"
)

// ReadActiveRuntimeFormulaFunctionBundles returns executable declarations only
// from active, immutable PackGeneration rows verified in the caller's Catalog
// compilation transaction. It never scans mutable InstalledPack state.
func ReadActiveRuntimeFormulaFunctionBundles(
	ctx context.Context,
	tx PackGenerationAuthorityExecutor,
) ([]formula.FunctionBundle, error) {
	if ctx == nil || tx == nil {
		return nil, fmt.Errorf(
			"%w: context and generation authority transaction are required",
			ErrPackGenerationPrecondition,
		)
	}
	generations, err := readActivePackGenerationsForCatalog(ctx, tx)
	if err != nil {
		return nil, err
	}
	var result []formula.FunctionBundle
	for _, generation := range generations {
		var bundles []formula.FunctionBundle
		if err := json.Unmarshal([]byte(generation.runtimeFormulaBundles.String), &bundles); err != nil {
			return nil, fmt.Errorf(
				"decode active pack %q formula function bundles: %w",
				generation.packName,
				err,
			)
		}
		result = append(result, formula.CloneFunctionBundles(bundles)...)
	}
	if err := formula.ValidateFunctionBundles(result); err != nil {
		return nil, fmt.Errorf("validate active formula function bundles: %w", err)
	}
	return result, nil
}
