package io.delphi.qa.auto.awsmfrw.common_baby.gson;

import com.google.gson.*;
import io.delphi.qa.auto.awsmfrw.common_baby.IsaCommonMethods;

import java.lang.reflect.Type;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

// this class can't be static
public class GsonUTCTimestampAdapter
    implements JsonSerializer<Timestamp>, JsonDeserializer<Timestamp>, IsaCommonMethods {

  @Override
  public synchronized JsonElement serialize(
      Timestamp timestamp, Type type, JsonSerializationContext jsonSerializationContext) {
    TimeZone tz = TimeZone.getDefault();
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
    long number = timestamp.getTime() - offsetInMillis;
    String string = new Timestamp(number).toString();
    return new JsonPrimitive(string);
  }

  @Override
  public synchronized Timestamp deserialize(
      JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) {
    TimeZone tz = TimeZone.getDefault();
    Calendar cal = GregorianCalendar.getInstance(tz);
    int offsetInMillis = tz.getOffset(cal.getTimeInMillis());
    Timestamp timestamp = Timestamp.valueOf(jsonElement.toString());
    long l = timestamp.getTime() + (long) offsetInMillis;
    return new Timestamp(l);
  }
}
