package com.airlock.iam.oauth2.domain.service.metadata;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import java.net.URI;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.Strings;

public final class OAuth2MetadataRequestUriToProviderUriConverter {
   public static final String DISCOVERY_RESOURCE_PATH = ".well-known/openid-configuration";
   public static final String METADATA_RESOURCE_PATH = ".well-known/oauth-authorization-server";
   private static final String WELL_KNOWN_URI_STRING_PATTERN = Pattern.quote("/.well-known/openid-configuration")
      + "|"
      + Pattern.quote("/.well-known/oauth-authorization-server");
   private static final Pattern METADATA_REQUEST_URL_PATTERN = Pattern.compile("^(.*)(" + WELL_KNOWN_URI_STRING_PATTERN + ")(/.*)?$");

   private OAuth2MetadataRequestUriToProviderUriConverter() {
   }

   public static URI convert(URI requestUri) {
      Matcher matcher = METADATA_REQUEST_URL_PATTERN.matcher(requestUri.toString());
      ViolationException.checkTrue(matcher.matches(), "Invalid metadata/discovery endpoint request");
      String result = matcher.replaceFirst("$1$3");
      return URI.create(stripTrailingSlash(result));
   }

   private static String stripTrailingSlash(String uri) {
      return Strings.CS.removeEnd(uri, "/");
   }
}
