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

package com.hypixel.hytale.assetstore.iterator;

import com.hypixel.hytale.assetstore.AssetRegistry;
import com.hypixel.hytale.assetstore.JsonAsset;
import javax.annotation.Nullable;
import com.hypixel.hytale.assetstore.AssetMap;
import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.Nonnull;
import java.util.List;
import java.io.Closeable;
import com.hypixel.hytale.assetstore.AssetStore;
import java.util.Iterator;

public class AssetStoreIterator implements Iterator<AssetStore<?, ?, ?>>, Closeable
{
    @Nonnull
    private final List<AssetStore<?, ?, ?>> list;
    
    public AssetStoreIterator(@Nonnull final Collection<AssetStore<?, ?, ?>> values) {
        this.list = new ArrayList<AssetStore<?, ?, ?>>(values);
    }
    
    @Override
    public boolean hasNext() {
        return !this.list.isEmpty();
    }
    
    @Nullable
    @Override
    public AssetStore<?, ?, ?> next() {
        final Iterator<AssetStore<?, ?, ?>> iterator = this.list.iterator();
        while (iterator.hasNext()) {
            final AssetStore<?, ? extends JsonAssetWithMap<?, ? extends AssetMap<?, ?>>, ? extends AssetMap<?, ? extends JsonAssetWithMap<?, ?>>> assetStore = iterator.next();
            if (this.isWaitingForDependencies(assetStore)) {
                continue;
            }
            iterator.remove();
            return assetStore;
        }
        return null;
    }
    
    public int size() {
        return this.list.size();
    }
    
    public boolean isWaitingForDependencies(@Nonnull final AssetStore<?, ?, ?> assetStore) {
        for (final Class<? extends JsonAsset<?>> aClass : assetStore.getLoadsAfter()) {
            final AssetStore otherStore = AssetRegistry.getAssetStore(aClass);
            if (otherStore == null) {
                throw new IllegalArgumentException("Unable to find asset store: " + String.valueOf(aClass));
            }
            if (this.list.contains(otherStore)) {
                return true;
            }
        }
        return false;
    }
    
    public boolean isBeingWaitedFor(@Nonnull final AssetStore<?, ?, ?> assetStore) {
        final Class<? extends JsonAssetWithMap<?, ? extends AssetMap<?, ?>>> assetClass = (Class<? extends JsonAssetWithMap<?, ? extends AssetMap<?, ?>>>)assetStore.getAssetClass();
        for (final AssetStore<?, ?, ?> store : this.list) {
            if (store.getLoadsAfter().contains(assetClass)) {
                return true;
            }
        }
        return false;
    }
    
    @Override
    public void close() {
    }
}
