package net.minecraft.server;

import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.server.dedicated.PropertyManager;

import com.bergerkiller.generated.net.minecraft.server.MinecraftServerHandle;

class MinecraftServer {
    private boolean hasStopped;

#if version >= 1.19
    public String getResourcePack() {
        MinecraftServer$ServerResourcePackInfo info = (MinecraftServer$ServerResourcePackInfo) instance.getServerResourcePack().orElse(null);
        return (info == null) ? "" : info.url();
    }
    public String getResourcePackHash() {
        MinecraftServer$ServerResourcePackInfo info = (MinecraftServer$ServerResourcePackInfo) instance.getServerResourcePack().orElse(null);
        return (info == null) ? "" : info.hash();
    }
#else
    public String getResourcePack();
    public String getResourcePackHash();
#endif

    public String getProperty(String key, String defaultValue) {
        DedicatedServer dedicatedServer = (DedicatedServer) instance;
        //PropertyManager
#if version >= 1.18
        return ((PropertyManager) dedicatedServer.getProperties()).properties.getProperty(key, defaultValue);
#elseif version >= 1.14
        return ((PropertyManager) dedicatedServer.getDedicatedServerProperties()).properties.getProperty(key, defaultValue);
#else
        return dedicatedServer.getPropertyManager().properties.getProperty(key, defaultValue);
#endif
    }

    public int getTicksSinceUnixEpoch() {
        return net.minecraft.server.MinecraftServer.currentTick;
    }

#select version >=
#case 1.18:   public int getTicks:getTickCount();
#case 1.17.1: public int getTicks:ah();
#case 1.16.4: public int getTicks:ai();
#case 1.16.2: public int getTicks:ah();
#case 1.16:   public int getTicks:ag();
#case 1.15.2: public int getTicks:ak();
#case 1.14.4: public int getTicks:aj();
#case 1.14:   public int getTicks:ai();
#case 1.13.1: public int getTicks:ah();
#case 1.13:   public int getTicks:aj();
#case 1.11:   public int getTicks:aq();
#case 1.9:    public int getTicks:ap();
#case 1.8.4:  public int getTicks:at();
#case 1.8.3:  public int getTicks:as();
#case else:   public int getTicks:ar();
#endselect

#if version >= 1.18
    public boolean isMainThread:isSameThread();
#elseif forge
    public boolean isMainThread() {
        return Thread.currentThread() == com.bergerkiller.bukkit.common.utils.CommonUtil.MAIN_THREAD;
    }
#else
    public boolean isMainThread();
#endif

    <code>
    private static MinecraftServerHandle _cached_instance = null;
    public static MinecraftServerHandle instance() {
        if (_cached_instance == null) {
            _cached_instance = com.bergerkiller.generated.org.bukkit.craftbukkit.CraftServerHandle.instance().getServer();
        }
        return _cached_instance;
    }
    </code>
}
