package query

import (
	"github.com/caos/zitadel/internal/eventstore"
	"github.com/caos/zitadel/internal/repository/iam"
	"github.com/caos/zitadel/internal/repository/member"
)

type IAMMemberReadModel struct {
	MemberReadModel

	userID string
	iamID  string
}

func NewIAMMemberReadModel(iamID, userID string) *IAMMemberReadModel {
	return &IAMMemberReadModel{
		iamID:  iamID,
		userID: userID,
	}
}

func (rm *IAMMemberReadModel) AppendEvents(events ...eventstore.EventReader) {
	for _, event := range events {
		switch e := event.(type) {
		case *iam.MemberAddedEvent:
			rm.MemberReadModel.AppendEvents(&e.MemberAddedEvent)
		case *iam.MemberChangedEvent:
			rm.MemberReadModel.AppendEvents(&e.MemberChangedEvent)
		case *member.MemberAddedEvent, *member.MemberChangedEvent,
			*iam.MemberRemovedEvent, *iam.MemberCascadeRemovedEvent:
			rm.MemberReadModel.AppendEvents(e)
		}
	}
}

func (rm *IAMMemberReadModel) Query() *eventstore.SearchQueryBuilder {
	return eventstore.NewSearchQueryBuilder(eventstore.ColumnsEvent).
		AddQuery().
		AggregateTypes(iam.AggregateType).
		AggregateIDs(rm.iamID).
		EventData(map[string]interface{}{
			"userId": rm.userID,
		}).Builder()
}