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

package com.hypixel.hytale.server.worldgen.loader.context;

import java.util.Iterator;
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import javax.annotation.Nonnull;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import java.util.Map;
import java.nio.file.Path;

public class FileContext<T>
{
    private final int id;
    private final String name;
    private final Path filepath;
    private final T parentContext;
    
    public FileContext(final int id, final String name, final Path filepath, final T parentContext) {
        this.id = id;
        this.name = name;
        this.filepath = filepath;
        this.parentContext = parentContext;
    }
    
    public int getId() {
        return this.id;
    }
    
    public String getName() {
        return this.name;
    }
    
    public Path getPath() {
        return this.filepath;
    }
    
    public T getParentContext() {
        return this.parentContext;
    }
    
    public static class Registry<T> implements Iterable<Map.Entry<String, T>>
    {
        private final String registryName;
        @Nonnull
        private final Object2ObjectMap<String, T> backing;
        
        public Registry(final String name) {
            this.registryName = name;
            this.backing = new Object2ObjectLinkedOpenHashMap<String, T>();
        }
        
        public int size() {
            return this.backing.size();
        }
        
        public String getName() {
            return this.registryName;
        }
        
        public boolean contains(final String name) {
            return this.backing.containsKey(name);
        }
        
        @Nonnull
        public T get(final String name) {
            final T value = this.backing.get(name);
            if (value == null) {
                throw new Error(String.format("Missing %s entry for key %s", this.registryName, name));
            }
            return value;
        }
        
        public void register(final String name, final T biome) {
            if (this.backing.containsKey(name)) {
                throw new Error(String.format("Duplicate %s entry registered for key %s", this.registryName, name));
            }
            this.backing.put(name, biome);
        }
        
        @Nonnull
        @Override
        public Iterator<Map.Entry<String, T>> iterator() {
            return this.backing.entrySet().iterator();
        }
    }
    
    public interface Constants
    {
        public static final String ERROR_MISSING_ENTRY = "Missing %s entry for key %s";
        public static final String ERROR_DUPLICATE_ENTRY = "Duplicate %s entry registered for key %s";
    }
}
