package tv.pluto.mongo.utils.json.mongocodec;

import java.time.Instant;
import java.util.Date;
import org.bson.BsonReader;
import org.bson.BsonType;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;

public class DateCodec implements Codec<Date> {

  @Override
  public Date decode(BsonReader reader, DecoderContext decoderContext) {
    BsonType currentType = reader.getCurrentBsonType();

    if (currentType == BsonType.DATE_TIME) {
      return new Date(reader.readDateTime());
    } else if (currentType == BsonType.STRING) {
      Instant parse = Instant.parse(reader.readString());
      return Date.from(parse);
    } else {
      throw new IllegalStateException("Unexpected BSON type for date field: " + currentType);
    }
  }

  @Override
  public void encode(BsonWriter writer, Date value, EncoderContext encoderContext) {
    writer.writeDateTime(value.getTime());
  }

  @Override
  public Class<Date> getEncoderClass() {
    return Date.class;
  }
}
