// 
// 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 com.hypixel.hytale.component.SystemGroup;

public class SystemGroupDependency<ECS_TYPE> extends Dependency<ECS_TYPE>
{
    @Nonnull
    private final SystemGroup<ECS_TYPE> group;
    
    public SystemGroupDependency(@Nonnull final Order order, @Nonnull final SystemGroup<ECS_TYPE> group) {
        this(order, group, OrderPriority.NORMAL);
    }
    
    public SystemGroupDependency(@Nonnull final Order order, @Nonnull final SystemGroup<ECS_TYPE> group, final int priority) {
        super(order, priority);
        this.group = group;
    }
    
    public SystemGroupDependency(@Nonnull final Order order, @Nonnull final SystemGroup<ECS_TYPE> group, @Nonnull final OrderPriority priority) {
        super(order, priority);
        this.group = group;
    }
    
    @Nonnull
    public SystemGroup<ECS_TYPE> getGroup() {
        return this.group;
    }
    
    @Override
    public void validate(@Nonnull final ComponentRegistry<ECS_TYPE> registry) {
        if (!registry.hasSystemGroup(this.group)) {
            throw new IllegalArgumentException("System dependency isn't registered: " + String.valueOf(this.group));
        }
    }
    
    @Override
    public void resolveGraphEdge(@Nonnull final ComponentRegistry<ECS_TYPE> registry, @Nonnull final ISystem<ECS_TYPE> thisSystem, @Nonnull final DependencyGraph<ECS_TYPE> graph) {
        switch (this.order) {
            case BEFORE: {
                for (final ISystem<ECS_TYPE> system : graph.getSystems()) {
                    if (this.group.equals(system.getGroup())) {
                        graph.addEdge(thisSystem, system, -this.priority);
                    }
                }
                break;
            }
            case AFTER: {
                for (final ISystem<ECS_TYPE> system : graph.getSystems()) {
                    if (this.group.equals(system.getGroup())) {
                        graph.addEdge(system, thisSystem, this.priority);
                    }
                }
                break;
            }
        }
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "SystemGroupDependency{group=" + String.valueOf(this.group) + "} " + super.toString();
    }
}
