package postgres

import (
	"github.com/zitadel/logging"

	"github.com/zitadel/zitadel/internal/v2/eventstore"
)

type intent struct {
	*eventstore.PushAggregate

	sequence uint32
}

func (i *intent) nextSequence() uint32 {
	i.sequence++
	return i.sequence
}

func makeIntents(pushIntent *eventstore.PushIntent) []*intent {
	res := make([]*intent, len(pushIntent.Aggregates()))

	for i, aggregate := range pushIntent.Aggregates() {
		res[i] = &intent{PushAggregate: aggregate}
	}

	return res
}

func intentByAggregate(intents []*intent, aggregate *eventstore.Aggregate) *intent {
	for _, intent := range intents {
		if intent.PushAggregate.Aggregate().Equals(aggregate) {
			return intent
		}
	}
	logging.WithFields("instance", aggregate.Instance, "owner", aggregate.Owner, "type", aggregate.Type, "id", aggregate.ID).Panic("no intent found")
	return nil
}

func checkSequences(intents []*intent) bool {
	for _, intent := range intents {
		if !eventstore.CheckSequence(intent.sequence, intent.PushAggregate.CurrentSequence()) {
			return false
		}
	}
	return true
}