package com.airlock.iam.common.infrastructure.credential;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.google.common.base.CharMatcher;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import java.util.List;
import java.util.Optional;

public class BearerTokenExtractor {
   private static final String AUTHORIZATION_HEADER_BEARER_PREFIX = "Bearer";
   private static final ELogger LOG = ELoggerFactory.getLogger(BearerTokenExtractor.class);

   public Optional<String> extract(String authorizationHeader) {
      Preconditions.checkNotNull(authorizationHeader);
      List<String> parts = Splitter.on(CharMatcher.whitespace()).trimResults().omitEmptyStrings().splitToList(authorizationHeader);
      if (parts.size() != 2) {
         LOG.debug("Authorization header " + LogUtil.quote(authorizationHeader) + " does not consist of exactly two parts.");
         return Optional.empty();
      } else if (!"Bearer".equalsIgnoreCase(parts.getFirst())) {
         LOG.debug("Authorization header " + LogUtil.quote(authorizationHeader) + " does not start with \"Bearer\".");
         return Optional.empty();
      } else {
         return Optional.of(parts.get(1));
      }
   }
}
