package com.airlock.iam.authentication.infrastructure.service.kerberos;

import com.airlock.iam.authentication.domain.model.kerberos.SpnegoTicket;
import com.airlock.iam.authentication.domain.model.kerberos.SpnegoTicketExtractor;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Strings;

public final class SpnegoTicketExtractorImpl implements SpnegoTicketExtractor {
   private static final String HTTP_AUTHORIZATION_HEADER = "Authorization";
   private static final String HEADER_VALUE_NEGOTIATE = "Negotiate";
   private static final String SPNEGO_PREFIX = "Negotiate ";
   private final Provider<HttpServletRequest> request;

   @Inject
   public SpnegoTicketExtractorImpl(Provider<HttpServletRequest> request) {
      this.request = request;
   }

   @Override
   public Optional<SpnegoTicket> extractSpnegoTicketHeader() {
      return Optional.ofNullable(((HttpServletRequest)this.request.get()).getHeader("Authorization"))
         .<String>map(StringUtils::trim)
         .filter(header -> header.startsWith("Negotiate "))
         .map(header -> Strings.CS.removeStart(header, "Negotiate "))
         .map(StringUtils::trimToNull)
         .<byte[]>map(Base64::decodeBase64)
         .map(SpnegoTicket::new);
   }
}
