package com.airlock.iam.techclientreg.application.service.oauth2.clientid;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationRequest;
import com.airlock.iam.techclientreg.application.configuration.registration.clientid.ClientIdFromRequestConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(ClientIdFromRequestConfig.class)
public class ClientIdFromRequestLogic implements DcrClientIdGenerator {
   private static final ELogger LOG = ELoggerFactory.getLogger(ClientIdFromRequestLogic.class);
   private final Provider<String> requestParameter;

   @Inject
   public ClientIdFromRequestLogic(Provider<String> requestParameter) {
      this.requestParameter = requestParameter;
   }

   @Override
   public Optional<OAuth2ClientId> generateClientId(OAuth2ClientRegistrationRequest request) {
      Optional<OAuth2ClientId> oAuth2ClientId = request.getMetadata()
         .getCustomStringClaim((String)this.requestParameter.get())
         .map(OAuth2ClientId::oAuth2ClientId);
      if (oAuth2ClientId.isEmpty()) {
         LOG.info("DCR request contained no client id parameter %s".formatted(LogUtil.logSafeQuote(this.requestParameter.get())));
      }

      return oAuth2ClientId;
   }
}
