package com.airlock.iam.techclientreg.infrastructure.jackson;

import com.airlock.iam.common.infrastructure.exception.RequestParseException;
import com.airlock.iam.techclientreg.infrastructure.transfer.request.OAuth2ClientRegistrationRequestContainer;
import com.airlock.iam.techclientreg.infrastructure.transfer.request.OAuth2ClientRegistrationRequestData;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.nimbusds.oauth2.sdk.client.ClientMetadata;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.parser.ParseException;

public class OAuth2TechClientRegistrationRequestDeserializer extends StdDeserializer<OAuth2ClientRegistrationRequestContainer> {
   public OAuth2TechClientRegistrationRequestDeserializer() {
      super(OAuth2ClientRegistrationRequestContainer.class);
   }

   @SuppressFBWarnings("DCN_NULLPOINTER_EXCEPTION")
   public OAuth2ClientRegistrationRequestContainer deserialize(JsonParser parser, DeserializationContext ctxt) {
      try {
         String json = parser.readValueAsTree().toString();
         ClientMetadata metadata = this.parseClientMetadata(json);
         OAuth2ClientRegistrationRequestContainer registrationRequest = new OAuth2ClientRegistrationRequestContainer();
         registrationRequest.setMetadata(metadata);
         registrationRequest.setRegistrationData(
            (OAuth2ClientRegistrationRequestData)new ObjectMapper().readValue(json, OAuth2ClientRegistrationRequestData.class)
         );
         return registrationRequest;
      } catch (IOException | ParseException | com.nimbusds.oauth2.sdk.ParseException | NullPointerException e) {
         throw new RequestParseException("Invalid JSON in client registration request: " + e.getMessage(), e);
      }
   }

   private ClientMetadata parseClientMetadata(String json) throws ParseException, com.nimbusds.oauth2.sdk.ParseException {
      JSONObject jsonObject = (JSONObject)new JSONParser(8128).parse(json, JSONObject.class);
      jsonObject.remove("software_statement");
      return ClientMetadata.parse(jsonObject);
   }
}
