// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.codec.codecs.simple;

import javax.annotation.Nullable;
import com.hypixel.hytale.codec.schema.config.NumberSchema;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.SchemaContext;
import java.io.IOException;
import com.hypixel.hytale.codec.util.RawJsonReader;
import org.bson.BsonDouble;
import com.hypixel.hytale.codec.ExtraInfo;
import javax.annotation.Nonnull;
import org.bson.BsonValue;
import com.hypixel.hytale.codec.PrimitiveCodec;
import com.hypixel.hytale.codec.RawJsonCodec;
import com.hypixel.hytale.codec.Codec;

public class DoubleCodec implements Codec<Double>, RawJsonCodec<Double>, PrimitiveCodec
{
    @Nonnull
    @Override
    public Double decode(@Nonnull final BsonValue bsonValue, final ExtraInfo extraInfo) {
        if (bsonValue.isString()) {
            final String value = bsonValue.asString().getValue();
            switch (value) {
                case "NaN": {
                    return Double.NaN;
                }
                case "Infinity": {
                    return Double.POSITIVE_INFINITY;
                }
                case "-Infinity": {
                    return Double.NEGATIVE_INFINITY;
                }
            }
        }
        return bsonValue.asNumber().doubleValue();
    }
    
    @Nonnull
    @Override
    public BsonValue encode(final Double t, final ExtraInfo extraInfo) {
        return new BsonDouble(t);
    }
    
    @Nonnull
    @Override
    public Double decodeJson(@Nonnull final RawJsonReader reader, final ExtraInfo extraInfo) throws IOException {
        return reader.readDoubleValue();
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context) {
        return new NumberSchema();
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context, @Nullable final Double def) {
        final NumberSchema s = new NumberSchema();
        if (def != null && !def.isNaN() && !def.isInfinite()) {
            s.setDefault(def);
        }
        return s;
    }
}
