package command

import (
	"context"

	"github.com/caos/logging"

	"github.com/caos/zitadel/internal/domain"
	"github.com/caos/zitadel/internal/eventstore"
	iam_repo "github.com/caos/zitadel/internal/repository/iam"
	org_repo "github.com/caos/zitadel/internal/repository/org"
)

type Step14 struct {
	ActivateExistingLabelPolicies bool
}

func (s *Step14) Step() domain.Step {
	return domain.Step14
}

func (s *Step14) execute(ctx context.Context, commandSide *Commands) error {
	return commandSide.SetupStep14(ctx, s)
}

func (c *Commands) SetupStep14(ctx context.Context, step *Step14) error {
	fn := func(iam *IAMWriteModel) ([]eventstore.EventPusher, error) {
		iamAgg := IAMAggregateFromWriteModel(&iam.WriteModel)
		var events []eventstore.EventPusher
		if step.ActivateExistingLabelPolicies {
			existingPolicies := NewExistingLabelPoliciesReadModel(ctx)
			err := c.eventstore.FilterToQueryReducer(ctx, existingPolicies)
			if err != nil {
				return nil, err
			}
			for _, aggID := range existingPolicies.aggregateIDs {
				if iamAgg.ID == aggID {
					events = append(events, iam_repo.NewLabelPolicyActivatedEvent(ctx, iamAgg))
					continue
				}
				events = append(events, org_repo.NewLabelPolicyActivatedEvent(ctx, &org_repo.NewAggregate(aggID, aggID).Aggregate))
			}
		}
		logging.Log("SETUP-M9fsd").Info("activate login policies")
		return events, nil
	}
	return c.setup(ctx, step, fn)
}