package com.airlock.iam.common.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.api.domain.model.event.AuthenticationMethodChanged;
import com.airlock.iam.common.application.configuration.event.AuthenticationMethodChangedEventConfig;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Inject;

@LogicForConfig(AuthenticationMethodChangedEventConfig.class)
public final class AuthenticationMethodChangedSubscribedEvent implements LoginappSubscribedEvent, AdminappSubscribedEvent {
   private static final String CANONICAL_NAME = "com.airlock.iam.common.api.domain.model.event.AuthenticationMethodChanged";
   private final ClassNameEventHandler classNameHandler;
   private final AuthenticationMethodChangedEventConfig config;

   @Inject
   public AuthenticationMethodChangedSubscribedEvent(AuthenticationMethodChangedEventConfig config) {
      this.config = config;
      this.classNameHandler = new ClassNameEventHandler("com.airlock.iam.common.api.domain.model.event.AuthenticationMethodChanged");
   }

   @Override
   public String subscribedEventClass() {
      return "com.airlock.iam.common.api.domain.model.event.AuthenticationMethodChanged";
   }

   @SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST", justification = "type is assured by canHandle")
   @Override
   public boolean canHandle(DomainEvent event) {
      return this.classNameHandler.canHandle(event) && !this.filter((AuthenticationMethodChanged)event);
   }

   private boolean filter(AuthenticationMethodChanged event) {
      return event.previousAuthenticationMethod().isEmpty() && this.config.isIgnoreEmptyPreviousMethod()
         || event.activeAuthenticationMethod().isEmpty() && this.config.isIgnoreEmptyActiveMethod();
   }
}
