package com.airlock.iam.login.domain.model.event;

import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.event.LoginappSubscribedEvent;
import com.airlock.iam.flow.shared.domain.model.event.GenericStepResultUserEvent;
import com.airlock.iam.login.application.configuration.event.GenericStepResultWithUserSubscribedEventConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(GenericStepResultWithUserSubscribedEventConfig.class)
public final class GenericStepResultWithUserSubscribedEvent implements LoginappSubscribedEvent {
   private final Provider<FlowEventFilter> flowEventFilter;
   private final Provider<StepResultFilter> stepResultFilter;

   @Inject
   public GenericStepResultWithUserSubscribedEvent(Provider<FlowEventFilter> flowEventFilter, Provider<StepResultFilter> stepResultFilter) {
      this.flowEventFilter = flowEventFilter;
      this.stepResultFilter = stepResultFilter;
   }

   @Override
   public boolean canHandle(DomainEvent event) {
      return event instanceof GenericStepResultUserEvent resultEvent
         && ((FlowEventFilter)this.flowEventFilter.get()).matchesFlowFilters(event)
         && ((StepResultFilter)this.stepResultFilter.get()).matchesStepResultFilters(resultEvent);
   }

   @Override
   public String subscribedEventClass() {
      return GenericStepResultUserEvent.class.getName();
   }
}
