package com.asana;

import com.google.api.client.util.DateTime;
import com.google.gson.*;

import java.lang.reflect.Type;
import java.text.ParseException;

/**
 * Class to handle serialization/deserialization of JSON
 */
public class Json {
    private static Gson instance;

    /**
     * Implements ISO 3339 date/time deserialization since SimpleDateFormat in Java 6 does not support the "X" format specifier
     */
    private static class ISO3339DateDeserializer implements JsonDeserializer<DateTime> {
        @Override
        public DateTime deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) {
            DateTime result = null;
            try {
                String date = jsonElement.getAsString();
                result = DateTime.parseRfc3339(date);
            } catch (NumberFormatException e)  {
                System.err.println("Couldn't parse date: " + jsonElement.getAsString());
            }
            return result;
        }
    }

    /**
     * @return Singleton instance of the Gson parser that handle Asana's date format (ISO 3339)
     */
    static public Gson getInstance() {
        if (instance == null) {
            instance = new GsonBuilder()
                    .registerTypeAdapter(DateTime.class, new ISO3339DateDeserializer())
                    .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                    .create();
        }
        return instance;
    }
}