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

package com.hypixel.hytale.server.core.command.system;

import java.util.Iterator;
import java.util.Collections;
import java.util.function.Predicate;
import java.util.Objects;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import javax.annotation.Nonnull;
import java.util.Map;

public class AbbreviationMap<Value>
{
    private final Map<String, Value> abbreviationMap;
    
    public AbbreviationMap(@Nonnull final Map<String, Value> abbreviationMap) {
        this.abbreviationMap = abbreviationMap;
    }
    
    public Value get(@Nonnull final String abbreviation) {
        return this.abbreviationMap.get(abbreviation.toLowerCase());
    }
    
    @Nonnull
    public static <V> AbbreviationMapBuilder<V> create() {
        return new AbbreviationMapBuilder<V>();
    }
    
    public static class AbbreviationMapBuilder<Value>
    {
        private final Map<String, Value> keys;
        
        public AbbreviationMapBuilder() {
            this.keys = new Object2ObjectOpenHashMap<String, Value>();
        }
        
        @Nonnull
        public AbbreviationMapBuilder<Value> put(@Nonnull final String key, @Nonnull final Value value) {
            if (this.keys.putIfAbsent(key.toLowerCase(), value) != null) {
                throw new IllegalArgumentException("Cannot have values with the same key in AbbreviationMap: " + key);
            }
            return this;
        }
        
        @Nonnull
        public AbbreviationMap<Value> build() {
            final Object2ObjectOpenHashMap<String, Value> abbreviationMap = new Object2ObjectOpenHashMap<String, Value>();
            for (final Map.Entry<String, Value> entry : this.keys.entrySet()) {
                this.appendAbbreviation(entry.getKey(), entry.getValue(), abbreviationMap);
            }
            abbreviationMap.values().removeIf(Objects::isNull);
            abbreviationMap.trim();
            return new AbbreviationMap<Value>(Collections.unmodifiableMap((Map<? extends String, ? extends Value>)abbreviationMap));
        }
        
        private void appendAbbreviation(@Nonnull final String key, @Nonnull final Value value, @Nonnull final Map<String, Value> map) {
            map.put(key, value);
            for (int i = 1; i < key.length(); ++i) {
                final String substring = key.substring(0, key.length() - i);
                final Value existingAbbreviationValue = map.get(substring);
                if (existingAbbreviationValue == null) {
                    map.put(substring, value);
                }
                else if (!this.keys.containsKey(substring)) {
                    if (!existingAbbreviationValue.equals(value)) {
                        map.put(substring, null);
                    }
                }
            }
        }
    }
}
