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

package com.hypixel.hytale.math.codec;

import java.util.Set;
import com.hypixel.hytale.codec.validation.ValidationResults;
import com.hypixel.hytale.codec.schema.config.IntegerSchema;
import com.hypixel.hytale.codec.schema.config.ArraySchema;
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 org.bson.BsonArray;
import com.hypixel.hytale.codec.ExtraInfo;
import javax.annotation.Nonnull;
import org.bson.BsonValue;
import com.hypixel.hytale.codec.validation.ValidatableCodec;
import com.hypixel.hytale.math.range.IntRange;
import com.hypixel.hytale.codec.Codec;

public class IntRangeArrayCodec implements Codec<IntRange>, ValidatableCodec<IntRange>
{
    @Nonnull
    @Override
    public IntRange decode(@Nonnull final BsonValue bsonValue, final ExtraInfo extraInfo) {
        final BsonArray document = bsonValue.asArray();
        return new IntRange(document.get(0).asNumber().intValue(), document.get(1).asNumber().intValue());
    }
    
    @Nonnull
    @Override
    public BsonValue encode(@Nonnull final IntRange t, final ExtraInfo extraInfo) {
        final BsonArray array = new BsonArray();
        array.add(new BsonDouble(t.getInclusiveMin()));
        array.add(new BsonDouble(t.getInclusiveMax()));
        return array;
    }
    
    @Nonnull
    @Override
    public IntRange decodeJson(@Nonnull final RawJsonReader reader, final ExtraInfo extraInfo) throws IOException {
        reader.expect('[');
        reader.consumeWhiteSpace();
        final int inclusiveMin = reader.readIntValue();
        reader.consumeWhiteSpace();
        reader.expect(',');
        reader.consumeWhiteSpace();
        final int inclusiveMax = reader.readIntValue();
        reader.consumeWhiteSpace();
        reader.expect(']');
        reader.consumeWhiteSpace();
        return new IntRange(inclusiveMin, inclusiveMax);
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context) {
        final ArraySchema s = new ArraySchema();
        s.setTitle("IntRange");
        s.setItems(new IntegerSchema(), new IntegerSchema());
        s.setMinItems(2);
        s.setMaxItems(2);
        return s;
    }
    
    @Override
    public void validate(@Nonnull final IntRange range, @Nonnull final ExtraInfo extraInfo) {
        if (range.getInclusiveMin() > range.getInclusiveMax()) {
            final ValidationResults results = extraInfo.getValidationResults();
            results.fail(String.format("Min (%d) > Max (%d)", range.getInclusiveMin(), range.getInclusiveMax()));
            results._processValidationResults();
        }
    }
    
    @Override
    public void validateDefaults(final ExtraInfo extraInfo, final Set<Codec<?>> tested) {
    }
}
