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

package com.hypixel.hytale.server.core.plugin.registry;

import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.assetstore.JsonAsset;
import com.hypixel.hytale.codec.lookup.Priority;
import javax.annotation.Nonnull;
import com.hypixel.hytale.assetstore.AssetRegistry;
import com.hypixel.hytale.function.consumer.BooleanConsumer;
import java.util.List;
import com.hypixel.hytale.codec.lookup.StringCodecMapCodec;
import com.hypixel.hytale.codec.Codec;

public class CodecMapRegistry<T, C extends Codec<? extends T>> implements IRegistry
{
    protected final StringCodecMapCodec<T, C> mapCodec;
    protected final List<BooleanConsumer> unregister;
    
    public CodecMapRegistry(final List<BooleanConsumer> unregister, final StringCodecMapCodec<T, C> mapCodec) {
        this.unregister = unregister;
        this.mapCodec = mapCodec;
    }
    
    @Nonnull
    public CodecMapRegistry<T, C> register(final String id, final Class<? extends T> aClass, final C codec) {
        this.mapCodec.register(id, (Class<?>)aClass, (C)codec);
        this.unregister.add(shutdown -> {
            AssetRegistry.ASSET_LOCK.writeLock().lock();
            try {
                this.mapCodec.remove(aClass);
            }
            finally {
                AssetRegistry.ASSET_LOCK.writeLock().unlock();
            }
            return;
        });
        return this;
    }
    
    @Nonnull
    public CodecMapRegistry<T, C> register(@Nonnull final Priority priority, @Nonnull final String id, final Class<? extends T> aClass, final C codec) {
        this.mapCodec.register(priority, id, aClass, codec);
        this.unregister.add(shutdown -> {
            AssetRegistry.ASSET_LOCK.writeLock().lock();
            try {
                this.mapCodec.remove(aClass);
            }
            finally {
                AssetRegistry.ASSET_LOCK.writeLock().unlock();
            }
            return;
        });
        return this;
    }
    
    @Override
    public void shutdown() {
    }
    
    public static class Assets<T extends JsonAsset<?>, C extends Codec<? extends T>> extends CodecMapRegistry<T, C>
    {
        public Assets(final List<BooleanConsumer> unregister, final StringCodecMapCodec<T, C> mapCodec) {
            super(unregister, mapCodec);
        }
        
        @Nonnull
        public Assets<T, C> register(@Nonnull final String id, final Class<? extends T> aClass, final BuilderCodec<? extends T> codec) {
            ((AssetCodecMapCodec)this.mapCodec).register(id, aClass, codec);
            this.unregister.add(shutdown -> {
                AssetRegistry.ASSET_LOCK.writeLock().lock();
                try {
                    this.mapCodec.remove(aClass);
                }
                finally {
                    AssetRegistry.ASSET_LOCK.writeLock().unlock();
                }
                return;
            });
            return this;
        }
        
        @Nonnull
        public Assets<T, C> register(@Nonnull final Priority priority, @Nonnull final String id, final Class<? extends T> aClass, final BuilderCodec<? extends T> codec) {
            ((AssetCodecMapCodec)this.mapCodec).register(priority, id, aClass, codec);
            this.unregister.add(shutdown -> {
                AssetRegistry.ASSET_LOCK.writeLock().lock();
                try {
                    this.mapCodec.remove(aClass);
                }
                finally {
                    AssetRegistry.ASSET_LOCK.writeLock().unlock();
                }
                return;
            });
            return this;
        }
    }
}
