package mstore

import (
	"context"

	"github.com/FAU-CDI/wisski-distillery/internal/dis/component/meta"
	"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient"
)

// MStore implements metadata storage for this WissKI
type MStore struct {
	ingredient.Base
	*meta.Storage
}

// For is a Store for the provided value
type For[Value any] meta.TypedKey[Value]

func (f For[Value]) Get(ctx context.Context, m *MStore) (value Value, err error) {
	return meta.TypedKey[Value](f).Get(ctx, m.Storage)
}

func (f For[Value]) GetAll(ctx context.Context, m *MStore) (values []Value, err error) {
	return meta.TypedKey[Value](f).GetAll(ctx, m.Storage)
}

func (f For[Value]) GetOrSet(ctx context.Context, m *MStore, dflt Value) (value Value, err error) {
	return meta.TypedKey[Value](f).GetOrSet(ctx, m.Storage, dflt)
}

func (f For[Value]) Set(ctx context.Context, m *MStore, value Value) error {
	return meta.TypedKey[Value](f).Set(ctx, m.Storage, value)
}

func (f For[Value]) SetAll(ctx context.Context, m *MStore, values ...Value) error {
	return meta.TypedKey[Value](f).SetAll(ctx, m.Storage, values...)
}

func (f For[Value]) Delete(ctx context.Context, m *MStore) error {
	return m.Storage.Delete(ctx, meta.Key(f))
}
