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.ContextDataChanged;
import com.airlock.iam.common.application.configuration.event.ContextDataChangedSubscribedEventConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.regex.Pattern;

@LogicForConfig(ContextDataChangedSubscribedEventConfig.class)
public final class ContextDataChangedSubscribedEvent implements LoginappSubscribedEvent, AdminappSubscribedEvent {
   private static final String CANONICAL_NAME = "com.airlock.iam.common.api.domain.model.event.ContextDataChanged";
   private final ClassNameEventHandler classNameHandler = new ClassNameEventHandler("com.airlock.iam.common.api.domain.model.event.ContextDataChanged");
   private final Provider<Pattern> fieldNamePattern;

   @Inject
   public ContextDataChangedSubscribedEvent(Provider<Pattern> fieldNamePattern) {
      this.fieldNamePattern = fieldNamePattern;
   }

   @Override
   public boolean canHandle(DomainEvent event) {
      return this.classNameHandler.canHandle(event) && this.filter(event);
   }

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

   private boolean filter(DomainEvent event) {
      return event instanceof ContextDataChanged && this.fieldMatchesPattern((ContextDataChanged)event);
   }

   private boolean fieldMatchesPattern(ContextDataChanged event) {
      return event.changes()
         .stream()
         .map(ContextDataChanged.ContextDataChange::name)
         .anyMatch(name -> ((Pattern)this.fieldNamePattern.get()).matcher(name).matches());
   }
}
