package org.aaronhe.threetengson;

import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

import org.threeten.bp.Instant;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.LocalTime;
import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.OffsetTime;
import org.threeten.bp.ZonedDateTime;

import java.lang.reflect.Type;

/**
 * {@code ThreeTenGsonAdapter} contains static methods for registering ThreeTen BP type on GsonBuilder.
 */
public class ThreeTenGsonAdapter {

    private ThreeTenGsonAdapter() {
    }


    public static GsonBuilder registerInstant(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(Instant.class, new InstantConverter());
    }

    public static GsonBuilder registerLocalDate(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(LocalDate.class, new LocalDateConverter());
    }

    public static GsonBuilder registerLocalDateTime(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeConverter());
    }

    public static GsonBuilder registerLocalTime(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(LocalTime.class, new LocalTimeConverter());
    }

    public static GsonBuilder registerOffsetDateTime(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeConverter());
    }

    public static GsonBuilder registerOffsetTime(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(OffsetTime.class, new OffsetTimeConverter());
    }

    public static GsonBuilder registerZonedDateTime(GsonBuilder gsonBuilder) {
        return gsonBuilder.registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeConverter());
    }

    /**
     * A convenient method to register all supported ThreeTen BP types.
     * @param gsonBuilder a GsonBuilder to be registered.
     * @return a GsonBuilder knows how to de/serialize all supported ThreeTen BP types.
     */
    public static GsonBuilder registerAll(GsonBuilder gsonBuilder) {
        registerInstant(gsonBuilder);
        registerLocalDate(gsonBuilder);
        registerLocalDateTime(gsonBuilder);
        registerLocalTime(gsonBuilder);
        registerLocalDate(gsonBuilder);
        registerOffsetDateTime(gsonBuilder);
        registerOffsetTime(gsonBuilder);
        registerZonedDateTime(gsonBuilder);

        return gsonBuilder;
    }

}