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

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 IntegerCodec implements Codec<Integer> {

  @Override
  public Integer decode(BsonReader reader, DecoderContext decoderContext) {
    if (reader.getCurrentBsonType() == org.bson.BsonType.DOUBLE) {
      return (int) reader.readDouble();
    } else if (reader.getCurrentBsonType() == org.bson.BsonType.INT32) {
      return reader.readInt32();
    } else if (reader.getCurrentBsonType() == BsonType.INT64) {
      return (int) reader.readInt64();
    } else {
      throw new IllegalArgumentException("Expected an int or double BSON type.");
    }
  }

  @Override
  public void encode(BsonWriter writer, Integer value, EncoderContext encoderContext) {
    writer.writeInt32(value);
  }

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