package com.airlock.iam.admin.application.service.token.generic;

import com.airlock.iam.admin.application.configuration.generic.GenericTokenControllerConfig;
import com.airlock.iam.admin.domain.model.token.generic.GenericTokenIdentifier;
import com.airlock.iam.admin.domain.model.token.generic.GenericTokenUi;
import com.airlock.iam.admin.domain.model.user.UserSpecificSettings;
import com.airlock.iam.admin.domain.service.token.generic.GenericTokenUiFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

public final class GenericTokenUiService {
   private final Provider<UserSpecificSettings> userSpecificSettings;
   private final Provider<GenericTokenUiFactory> factory;

   @Inject
   public GenericTokenUiService(Provider<UserSpecificSettings> userSpecificSettings, Provider<GenericTokenUiFactory> factory) {
      this.userSpecificSettings = userSpecificSettings;
      this.factory = factory;
   }

   public Optional<GenericTokenUi> getUserSpecificGenericTokenUi(GenericTokenIdentifier identifier) {
      return ((UserSpecificSettings)this.userSpecificSettings.get())
         .getTokenControllers()
         .stream()
         .filter(controller -> controller.getTokenControllerId().equals(identifier.id()))
         .findFirst()
         .filter(GenericTokenControllerConfig.class::isInstance)
         .map(GenericTokenControllerConfig.class::cast)
         .flatMap(this::getUi);
   }

   private Optional<GenericTokenUi> getUi(GenericTokenControllerConfig config) {
      Optional<String> enabledProperty = config.getTokenEndpoint().getTokenRepository().getEnabledProperty();
      int maxTokenCount = config.getTokenEndpoint().getTokenRepository().getMaxTokensPerUser();
      Optional<GenericTokenUi> tokenUi = config.genericTokenControllerUi()
         .map(tokenControllerUi -> ((GenericTokenUiFactory)this.factory.get()).getUiFor(tokenControllerUi));
      Optional<GenericTokenUi> tokenUiWithMaxTokenCount = tokenUi.map(ui -> ui.toBuilder().maxTokenCount(maxTokenCount).build());
      return enabledProperty.<Optional<? extends GenericTokenUi>>map(
            property -> tokenUiWithMaxTokenCount.map(ui -> ui.toBuilder().enabledProperty(property).build())
         )
         .orElse(tokenUiWithMaxTokenCount);
   }
}
