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

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

import java.util.Iterator;
import com.hypixel.hytale.common.util.StringCompareUtil;
import java.util.Locale;
import java.util.Collection;
import java.util.function.Function;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import it.unimi.dsi.fastutil.ints.IntObjectPair;
import java.util.Comparator;

public class SuggestionResult
{
    private static final int FUZZY_SUGGESTION_MAX_RESULTS = 5;
    @Nonnull
    private static final Comparator<IntObjectPair<String>> INTEGER_STRING_PAIR_COMPARATOR;
    private final List<String> suggestions;
    
    public SuggestionResult() {
        this.suggestions = new ObjectArrayList<String>();
    }
    
    @Nonnull
    public SuggestionResult suggest(@Nonnull final String suggestion) {
        this.suggestions.add(suggestion);
        return this;
    }
    
    @Nonnull
    public <DataType> SuggestionResult suggest(@Nonnull final Function<DataType, String> toStringFunction, @Nonnull final DataType suggestion) {
        return this.suggest(toStringFunction.apply(suggestion));
    }
    
    @Nonnull
    public SuggestionResult suggest(@Nonnull final Object objectToString) {
        return this.suggest(objectToString.toString());
    }
    
    @Nonnull
    public List<String> getSuggestions() {
        return this.suggestions;
    }
    
    @Nonnull
    public <DataType> SuggestionResult fuzzySuggest(@Nonnull final String input, @Nonnull final Collection<DataType> items, @Nonnull final Function<DataType, String> toStringFunction) {
        final List<IntObjectPair<String>> sorting = new ObjectArrayList<IntObjectPair<String>>(5);
        int lowestStoredFuzzyValue = Integer.MIN_VALUE;
        for (final DataType item : items) {
            final String toString = toStringFunction.apply(item);
            final int fuzzyValue = StringCompareUtil.getFuzzyDistance(toString, input, Locale.ENGLISH);
            if (sorting.size() == 5) {
                if (fuzzyValue < lowestStoredFuzzyValue) {
                    continue;
                }
                sorting.set(0, IntObjectPair.of(fuzzyValue, toString));
            }
            else {
                sorting.add(IntObjectPair.of(fuzzyValue, toString));
            }
            sorting.sort(SuggestionResult.INTEGER_STRING_PAIR_COMPARATOR);
            lowestStoredFuzzyValue = sorting.getFirst().leftInt();
        }
        for (final IntObjectPair<String> integerStringPair : sorting) {
            this.suggest(integerStringPair.right());
        }
        return this;
    }
    
    static {
        INTEGER_STRING_PAIR_COMPARATOR = Comparator.comparingInt(IntObjectPair::leftInt);
    }
}
