package org

import (
	"context"

	"github.com/caos/zitadel/internal/eventstore"
	"github.com/caos/zitadel/internal/eventstore/repository"
	"github.com/caos/zitadel/internal/repository/features"
)

var (
	FeaturesSetEventType     = orgEventTypePrefix + features.FeaturesSetEventType
	FeaturesRemovedEventType = orgEventTypePrefix + features.FeaturesRemovedEventType
)

type FeaturesSetEvent struct {
	features.FeaturesSetEvent
}

func NewFeaturesSetEvent(
	ctx context.Context,
	aggregate *eventstore.Aggregate,
	changes []features.FeaturesChanges,
) (*FeaturesSetEvent, error) {
	changedEvent, err := features.NewFeaturesSetEvent(
		eventstore.NewBaseEventForPush(
			ctx,
			aggregate,
			FeaturesSetEventType),
		changes,
	)
	if err != nil {
		return nil, err
	}
	return &FeaturesSetEvent{FeaturesSetEvent: *changedEvent}, nil
}

func FeaturesSetEventMapper(event *repository.Event) (eventstore.Event, error) {
	e, err := features.FeaturesSetEventMapper(event)
	if err != nil {
		return nil, err
	}

	return &FeaturesSetEvent{FeaturesSetEvent: *e.(*features.FeaturesSetEvent)}, nil
}

type FeaturesRemovedEvent struct {
	features.FeaturesRemovedEvent
}

func NewFeaturesRemovedEvent(
	ctx context.Context,
	aggregate *eventstore.Aggregate,
) *FeaturesRemovedEvent {
	return &FeaturesRemovedEvent{
		FeaturesRemovedEvent: *features.NewFeaturesRemovedEvent(
			eventstore.NewBaseEventForPush(
				ctx,
				aggregate,
				FeaturesRemovedEventType),
		),
	}
}

func FeaturesRemovedEventMapper(event *repository.Event) (eventstore.Event, error) {
	e, err := features.FeaturesRemovedEventMapper(event)
	if err != nil {
		return nil, err
	}

	return &FeaturesRemovedEvent{FeaturesRemovedEvent: *e.(*features.FeaturesRemovedEvent)}, nil
}