package com.airlock.iam.login.app.misc.oauth2;

import com.airlock.iam.oauth2.domain.model.OAuth2Param;
import com.airlock.iam.oauth2.domain.model.validation.OAuth2Error;
import com.fasterxml.jackson.jr.ob.JSON;
import com.fasterxml.jackson.jr.ob.JSONComposer;
import com.fasterxml.jackson.jr.ob.comp.ObjectComposer;
import com.nimbusds.oauth2.sdk.GrantType;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;

public final class OAuth2Utils {
   public static final String SCOPE_OPENID = "openid";
   public static final String RESPONSE_TYPE_CODE = "code";
   public static final String GRANT_TYPE_AUTHORIZATION_CODE = GrantType.AUTHORIZATION_CODE.getValue();
   public static final String GRANT_TYPE_REFRESH = GrantType.REFRESH_TOKEN.getValue();
   public static final String GRANT_TYPE_CLIENT_CREDENTIALS = GrantType.CLIENT_CREDENTIALS.getValue();
   public static final String GRANT_TYPE_TOKEN_EXCHANGE = GrantType.TOKEN_EXCHANGE.getValue();

   private OAuth2Utils() {
   }

   public static String generateErrorResponseBody(OAuth2Error errorType, Optional<String> errorDescription, Optional<String> errorUri) throws IOException {
      ObjectComposer<JSONComposer<String>> composer = JSON.std
         .composeString()
         .startObject()
         .put(OAuth2Param.ERROR.getParameterName(), errorType.getParameterValue());
      if (errorDescription.isPresent()) {
         composer.put(OAuth2Param.ERROR_DESCRIPTION.getParameterName(), errorDescription.get());
      }

      if (errorUri.isPresent()) {
         composer.put(OAuth2Param.ERROR_URI.getParameterName(), errorUri.get());
      }

      return (String)((JSONComposer)composer.end()).finish();
   }

   public static void markResponseAsBadRequestWithJson(HttpServletResponse response) {
      response.setStatus(400);
      response.setHeader("Cache-Control", "no-store");
      response.setHeader("Pragma", "no-cache");
      response.setContentType("application/json;charset=UTF-8");
   }
}
