package com.airlock.iam.authentication.infrastructure.factory;

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.airlock.iam.common.infrastructure.factory.uriinfo.BaseUriDerivation;
import com.airlock.iam.common.infrastructure.factory.uriinfo.ExternalLinkCreation;
import com.airlock.iam.common.infrastructure.factory.uriinfo.ExternalUriInfoFactory;
import com.airlock.iam.common.infrastructure.request.RequestMethodInfo;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.net.URI;
import java.nio.file.Paths;
import org.apache.commons.lang3.Strings;

public final class AuthFlowExternalUriInfoModule extends PrivateModule {
   @Provides
   @RequestScoped
   @Exposed
   ExternalUriInfo provideExternalUriInfo(ExternalUriInfoFactory factory) {
      return factory.getExternalUriInfo();
   }

   @Provides
   @RequestScoped
   ExternalLinkCreation canCreateLinksForExternalBaseUri(RequestMethodInfo requestMethodInfo) {
      return (externalUriInfo, uriInfo) -> requestMethodInfo.oneShotEndpoint()
         || Paths.get(externalUriInfo.getBaseUri().getRawPath()).endsWith("public/authentication");
   }

   @Provides
   @RequestScoped
   BaseUriDerivation deriveActualBaseUriFromConfiguredValue() {
      return baseUri -> URI.create(Strings.CS.appendIfMissing(baseUri, "/", new CharSequence[0])).resolve("public/authentication").toString();
   }

   protected void configure() {
   }
}
