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

package com.hypixel.hytale.builtin.blockphysics;

import com.hypixel.hytale.server.core.universe.world.ValidationOption;
import java.util.List;
import com.hypixel.hytale.common.util.FormatUtil;
import java.util.logging.Level;
import com.hypixel.hytale.logger.HytaleLogger;
import joptsimple.OptionSpec;
import com.hypixel.hytale.server.core.Options;
import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
import com.hypixel.hytale.component.system.ISystem;
import com.hypixel.hytale.server.core.asset.LoadAssetEvent;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class BlockPhysicsPlugin extends JavaPlugin
{
    public BlockPhysicsPlugin(@Nonnull final JavaPluginInit init) {
        super(init);
    }
    
    @Override
    protected void setup() {
        this.getEventRegistry().register(LoadAssetEvent.class, BlockPhysicsPlugin::validatePrefabs);
        this.getChunkStoreRegistry().registerSystem(new BlockPhysicsSystems.Ticking());
    }
    
    public static void validatePrefabs(@Nonnull final LoadAssetEvent event) {
        if (!Options.getOptionSet().has(Options.VALIDATE_PREFABS) || event.isShouldShutdown()) {
            return;
        }
        final long start = System.nanoTime();
        final List<ValidationOption> validatePrefabs = Options.getOptionSet().valuesOf(Options.VALIDATE_PREFABS);
        final List<String> failedToValidatePrefabs = PrefabBufferValidator.validateAllPrefabs(validatePrefabs);
        if (!failedToValidatePrefabs.isEmpty()) {
            HytaleLogger.getLogger().at(Level.SEVERE).log("One or more prefabs failed to validate, Exiting!\n" + String.join("\n", failedToValidatePrefabs));
            event.failed(true, "failed to validate prefabs");
        }
        HytaleLogger.getLogger().at(Level.INFO).log("Validate prefabs phase completed! Boot time %s, Took %s", FormatUtil.nanosToString(System.nanoTime() - event.getBootStart()), FormatUtil.nanosToString(System.nanoTime() - start));
    }
}
