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

package com.hypixel.hytale.component.dependency;

import com.hypixel.hytale.component.system.ISystem;
import com.hypixel.hytale.component.ComponentRegistry;
import javax.annotation.Nonnull;
import java.util.Set;

public class RootDependency<ECS_TYPE> extends Dependency<ECS_TYPE>
{
    private static final RootDependency<?> FIRST;
    private static final RootDependency<?> LAST;
    private static final Set<Dependency<?>> FIRST_SET;
    private static final Set<Dependency<?>> LAST_SET;
    
    public static <ECS_TYPE> RootDependency<ECS_TYPE> first() {
        return (RootDependency<ECS_TYPE>)RootDependency.FIRST;
    }
    
    public static <ECS_TYPE> RootDependency<ECS_TYPE> last() {
        return (RootDependency<ECS_TYPE>)RootDependency.LAST;
    }
    
    public static <ECS_TYPE> Set<Dependency<ECS_TYPE>> firstSet() {
        return (Set<Dependency<ECS_TYPE>>)RootDependency.FIRST_SET;
    }
    
    public static <ECS_TYPE> Set<Dependency<ECS_TYPE>> lastSet() {
        return (Set<Dependency<ECS_TYPE>>)RootDependency.LAST_SET;
    }
    
    public RootDependency(final int priority) {
        super(Order.AFTER, priority);
    }
    
    public RootDependency(@Nonnull final OrderPriority priority) {
        super(Order.AFTER, priority);
    }
    
    @Override
    public void validate(@Nonnull final ComponentRegistry<ECS_TYPE> registry) {
    }
    
    @Override
    public void resolveGraphEdge(@Nonnull final ComponentRegistry<ECS_TYPE> registry, @Nonnull final ISystem<ECS_TYPE> thisSystem, @Nonnull final DependencyGraph<ECS_TYPE> graph) {
        if (this.order == Order.BEFORE) {
            throw new UnsupportedOperationException("RootDependency can't have Order.BEFORE!");
        }
        graph.addEdgeFromRoot(thisSystem, this.priority);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "SystemDependency{} " + super.toString();
    }
    
    static {
        FIRST = new RootDependency<Object>(OrderPriority.CLOSEST);
        LAST = new RootDependency<Object>(OrderPriority.FURTHEST);
        FIRST_SET = Set.of(RootDependency.FIRST);
        LAST_SET = Set.of(RootDependency.LAST);
    }
}
