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

package com.hypixel.hytale.codec.store;

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

public class StoredCodec<T> implements Codec<T>
{
    private final CodecKey<T> key;
    
    public StoredCodec(final CodecKey<T> key) {
        this.key = key;
    }
    
    @Override
    public T decode(final BsonValue bsonValue, @Nonnull final ExtraInfo extraInfo) {
        final Codec<T> codec = extraInfo.getCodecStore().getCodec(this.key);
        if (codec == null) {
            throw new IllegalArgumentException("Failed to find codec for " + String.valueOf(this.key));
        }
        return codec.decode(bsonValue, extraInfo);
    }
    
    @Override
    public BsonValue encode(final T t, @Nonnull final ExtraInfo extraInfo) {
        final Codec<T> codec = extraInfo.getCodecStore().getCodec(this.key);
        if (codec == null) {
            throw new IllegalArgumentException("Failed to find codec for " + String.valueOf(this.key));
        }
        return codec.encode(t, extraInfo);
    }
    
    @Nullable
    @Override
    public T decodeJson(@Nonnull final RawJsonReader reader, final ExtraInfo extraInfo) throws IOException {
        final Codec<T> codec = extraInfo.getCodecStore().getCodec(this.key);
        if (codec == null) {
            throw new IllegalArgumentException("Failed to find codec for " + String.valueOf(this.key));
        }
        return codec.decodeJson(reader, extraInfo);
    }
    
    @Nonnull
    @Override
    public Schema toSchema(@Nonnull final SchemaContext context) {
        final Codec<T> codec = CodecStore.STATIC.getCodec(this.key);
        if (codec == null) {
            throw new IllegalArgumentException("Failed to find codec for " + String.valueOf(this.key));
        }
        return context.refDefinition(codec);
    }
}
