// Copyright IBM Corp. 2020, 2026
// SPDX-License-Identifier: BUSL-1.1

package bsr

import (
	"context"
	"fmt"
)

// SummaryAllocFunc is a function that returns a summary type
type SummaryAllocFunc func(ctx context.Context) Summary

// summaryAllocFuncRegistry mappings of protocols and container type
// for each SummaryAllocFunc
type summaryAllocFuncRegistry map[Protocol]map[ContainerType]SummaryAllocFunc

func (r summaryAllocFuncRegistry) get(p Protocol, c ContainerType) (SummaryAllocFunc, bool) {
	protocol, ok := r[p]
	if !ok {
		return nil, false
	}
	af, ok := protocol[c]
	return af, ok
}

var summaryAllocFuncs summaryAllocFuncRegistry

// RegisterSummaryAllocFunc registers a SummaryAllocFunc for the given Protocol.
// A given Protocol and Container can only have one SummaryAllocFunc function
// registered.
func RegisterSummaryAllocFunc(p Protocol, c ContainerType, af SummaryAllocFunc) error {
	const op = "bsr.RegisterSummaryAllocFunc"

	if summaryAllocFuncs == nil {
		summaryAllocFuncs = make(map[Protocol]map[ContainerType]SummaryAllocFunc)
	}

	protocol, ok := summaryAllocFuncs[p]
	if !ok {
		protocol = make(map[ContainerType]SummaryAllocFunc)
	}

	_, ok = protocol[c]
	if ok {
		return fmt.Errorf("%s: %s protocol with %s container: %w", op, p, c, ErrAlreadyRegistered)
	}
	protocol[c] = af
	summaryAllocFuncs[p] = protocol
	return nil
}
