package com.airlock.iam.oauth2.infrastructure.service;

import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2AuthClientId;
import com.airlock.iam.oauth2.api.domain.model.clientauthentication.OAuth2ClientAuthenticationPayload;
import com.airlock.iam.oauth2.domain.model.OAuth2Param;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Optional;

public final class OAuth2GrantRequestParserUtils {
   private OAuth2GrantRequestParserUtils() {
   }

   public static Optional<OAuth2ClientId> getClientId(HttpServletRequest servletRequest, Optional<OAuth2ClientAuthenticationPayload> authenticationPayload) {
      Optional<OAuth2ClientId> requestClientId = parseClientId(servletRequest);
      return authenticationPayload.flatMap(OAuth2ClientAuthenticationPayload::clientId)
         .map(OAuth2AuthClientId::id)
         .map(OAuth2ClientId::oAuth2ClientId)
         .or(() -> requestClientId);
   }

   private static Optional<OAuth2ClientId> parseClientId(HttpServletRequest request) {
      return Optional.ofNullable(request.getParameter(OAuth2Param.CLIENT_ID.getParameterName())).map(OAuth2ClientId::oAuth2ClientId);
   }
}
