package command

import (
	"github.com/zitadel/zitadel/internal/domain"
	"github.com/zitadel/zitadel/internal/eventstore"
	"github.com/zitadel/zitadel/internal/repository/metadata"
)

type MetadataWriteModel struct {
	eventstore.WriteModel

	Key   string
	Value []byte
	State domain.MetadataState
}

func (wm *MetadataWriteModel) Reduce() error {
	for _, event := range wm.Events {
		switch e := event.(type) {
		case *metadata.SetEvent:
			if wm.Key != e.Key {
				continue
			}
			wm.Value = e.Value
			wm.State = domain.MetadataStateActive
		case *metadata.RemovedEvent:
			if wm.Key != e.Key {
				continue
			}
			wm.State = domain.MetadataStateRemoved
		case *metadata.RemovedAllEvent:
			wm.State = domain.MetadataStateRemoved
		}
	}
	return wm.WriteModel.Reduce()
}

type MetadataListWriteModel struct {
	eventstore.WriteModel

	metadataList map[string][]byte
}

func (wm *MetadataListWriteModel) Reduce() error {
	for _, event := range wm.Events {
		switch e := event.(type) {
		case *metadata.SetEvent:
			wm.metadataList[e.Key] = e.Value
		case *metadata.RemovedEvent:
			delete(wm.metadataList, e.Key)
		case *metadata.RemovedAllEvent:
			wm.metadataList = make(map[string][]byte)
		}
	}
	return wm.WriteModel.Reduce()
}