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

package com.hypixel.hytale.common.semver;

import java.util.function.BiPredicate;
import java.util.Objects;
import javax.annotation.Nonnull;

public class SemverComparator implements SemverSatisfies
{
    private final ComparisonType comparisonType;
    private final Semver compareTo;
    
    public SemverComparator(final ComparisonType comparisonType, final Semver compareTo) {
        this.comparisonType = comparisonType;
        this.compareTo = compareTo;
    }
    
    @Override
    public boolean satisfies(final Semver semver) {
        return this.comparisonType.satisfies(this.compareTo, semver);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return this.comparisonType.getPrefix() + String.valueOf(this.compareTo);
    }
    
    @Nonnull
    public static SemverComparator fromString(String str) {
        Objects.requireNonNull(str, "String can't be null!");
        str = str.trim();
        if (str.isEmpty()) {
            throw new IllegalArgumentException("String is empty!");
        }
        for (final ComparisonType comparisonType : ComparisonType.values()) {
            if (str.startsWith(comparisonType.getPrefix())) {
                final Semver semver = Semver.fromString(str.substring(comparisonType.getPrefix().length()));
                return new SemverComparator(comparisonType, semver);
            }
        }
        throw new IllegalArgumentException("Invalid comparator type! " + str);
    }
    
    public enum ComparisonType
    {
        GTE(">=", (ct, s) -> ct.compareTo(s) <= 0), 
        GT(">", (ct, s) -> ct.compareTo(s) < 0), 
        LTE("<=", (ct, s) -> ct.compareTo(s) >= 0), 
        LT("<", (ct, s) -> ct.compareTo(s) > 0), 
        EQUAL("=", (ct, s) -> ct.compareTo(s) == 0);
        
        private final String prefix;
        private final BiPredicate<Semver, Semver> satisfies;
        
        private ComparisonType(final String prefix, final BiPredicate<Semver, Semver> satisfies) {
            this.prefix = prefix;
            this.satisfies = satisfies;
        }
        
        public String getPrefix() {
            return this.prefix;
        }
        
        public boolean satisfies(final Semver compareTo, final Semver semver) {
            return this.satisfies.test(compareTo, semver);
        }
        
        public static boolean hasAPrefix(@Nonnull final String range) {
            for (final ComparisonType comparisonType : values()) {
                if (range.startsWith(comparisonType.prefix)) {
                    return true;
                }
            }
            return false;
        }
    }
}
