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.domain.model.event.GenericStepResultEvent;
import com.airlock.iam.login.application.configuration.event.GenericStepResultSubscribedEventConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

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

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

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

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