package com.airlock.iam.login.rest.infrastructure.service;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.domain.model.transform.TransformationProcessor;
import com.airlock.iam.flow.ui.infrastructure.service.RedirectTarget;
import com.airlock.iam.flow.ui.infrastructure.service.OnLogout.OnLogoutType;
import com.airlock.iam.login.rest.application.configuration.ParameterBasedTargetUriConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.net.URI;
import java.util.Optional;

@LogicForConfig(ParameterBasedTargetUriConfig.class)
public final class ParameterBasedTargetUri extends ExternalTargetUri {
   private final OnLogoutType onLogoutType;

   @Inject
   public ParameterBasedTargetUri(
      Provider<Optional<ValidTargetUriFromParameter>> uriFromParameter,
      Provider<RedirectTarget> defaultTarget,
      Provider<TransformationProcessor<URI>> processor
   ) {
      super(() -> resolveUri(uriFromParameter, defaultTarget), processor);
      this.onLogoutType = determineType(uriFromParameter, defaultTarget);
   }

   public OnLogoutType getType() {
      return this.onLogoutType;
   }

   private static OnLogoutType determineType(Provider<Optional<ValidTargetUriFromParameter>> uriFromParameter, Provider<RedirectTarget> defaultTarget) {
      return ((Optional)uriFromParameter.get()).isPresent() ? OnLogoutType.REDIRECT : ((RedirectTarget)defaultTarget.get()).getType();
   }

   private static URI resolveUri(Provider<Optional<ValidTargetUriFromParameter>> uriFromParameter, Provider<RedirectTarget> defaultTarget) {
      return ((Optional)uriFromParameter.get())
         .map(ValidTargetUriFromParameter::uri)
         .orElseGet(() -> URI.create(((RedirectTarget)defaultTarget.get()).getTarget()));
   }
}
