package io.apibuilder.examples.graphql.users.android;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.lang.Override;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.ISODateTimeFormat;

/**
 * Generated by API Builder - https://www.apibuilder.io
 * Service version: 0.0.1
 * User agent: apibuilder app.apibuilder.io/apicollective/examples-graphql-users/0.0.1/android_rx2_client
 *
 * WARNING: not all features (notably unions) and data types work with android generator yet.  
 * Android generator is designed to be used in an android application, but should work in any java codebase as long as you import jackson, retrofit2 and RxJava2 libraries.  
 * If you are considering using this library, would like to request/discuss features, or would like to share how you're using it, please contact android-feedback@gilt.com 
 *
 */
public class ApiBuilderObjectMapper extends ObjectMapper {
  public static final DateTimeFormatter formatter = ISODateTimeFormat.dateTimeParser();

  private static final ObjectMapper MAPPER;

  static {
    SimpleModule module = new SimpleModule(new Version(1, 0, 0, null, null, null));
    module.addDeserializer(DateTime.class, new JsonDeserializer() {
      @Override
      public DateTime deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws
          IOException {
        String value = jsonParser.getValueAsString();
        return formatter.parseDateTime(value);
      }
    });
    module.addSerializer(DateTime.class, new JsonSerializer<DateTime>() {
      @Override
      public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider) throws
          IOException {
        jgen.writeString(value.toString(formatter));
      }
    });
    MAPPER = new ObjectMapper();
    MAPPER.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
    MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    MAPPER.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
    MAPPER.registerModule(module);
  }

  public static ObjectMapper getInstance() {
    return MAPPER;
  }
}