package net.minecraft.server.level;

import com.bergerkiller.generated.net.minecraft.server.level.LightEngineThreadedHandle;

// Since MC 1.14
optional class LightEngineThreaded {

    public void schedule(Runnable runnable) {
#if exists net.minecraft.server.level.LightEngineThreaded
  #if exists net.minecraft.server.level.WorldServer public final ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler moonrise$getChunkTaskScheduler();
        // Paper new chunk system - mixin mode - now stored in WorldServer
        #require LightEngineThreaded private final net.minecraft.server.level.PlayerChunkMap chunkMap;
        net.minecraft.server.level.PlayerChunkMap pcm = instance#chunkMap;
        net.minecraft.server.level.WorldServer world = pcm.level;
    #if version >= 1.21.2
        world.moonrise$getChunkTaskScheduler().parallelGenExecutor.queueTask(runnable);
    #else
        world.moonrise$getChunkTaskScheduler().parallelGenExecutor.queueRunnable(runnable);
    #endif
  #elseif exists net.minecraft.server.level.WorldServer public final io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler chunkTaskScheduler;
        // Paper new chunk system - now stored in WorldServer
        #require LightEngineThreaded private final net.minecraft.server.level.PlayerChunkMap chunkMap;
        net.minecraft.server.level.PlayerChunkMap pcm = instance#chunkMap;
        net.minecraft.server.level.WorldServer world = pcm.level;
    #if version >= 1.20
        world.chunkTaskScheduler.parallelGenExecutor.queueRunnable(runnable);
    #else
        world.chunkTaskScheduler.lightExecutor.queueRunnable(runnable);
    #endif

  #elseif version >= 1.21.2
        // Spigot/Legacy Paper >= 1.21.2
        #require net.minecraft.server.level.LightEngineThreaded private final net.minecraft.util.thread.ConsecutiveExecutor consecutiveExecutor;
        net.minecraft.util.thread.ConsecutiveExecutor executor = instance#consecutiveExecutor;
        executor.schedule(runnable);
  #else
        // Spigot/Legacy Paper < 1.21.2
    #if exists net.minecraft.server.level.LightEngineThreaded private final net.minecraft.util.thread.ThreadedMailbox<Runnable> taskMailbox;
        #require net.minecraft.server.level.LightEngineThreaded private final net.minecraft.util.thread.ThreadedMailbox<Runnable> taskMailbox;
    #else
        #require net.minecraft.server.level.LightEngineThreaded private final net.minecraft.util.thread.ThreadedMailbox<Runnable> taskMailbox:b;
    #endif
        net.minecraft.util.thread.ThreadedMailbox mailbox = instance#taskMailbox;
    #if version >= 1.18
        mailbox.tell(runnable);
    #else
        mailbox.a((Object) runnable);
    #endif
  #endif
#endif
    }

    public static LightEngineThreadedHandle forWorld((org.bukkit.World) net.minecraft.world.level.World world) {
#if version >= 1.18
        LightEngineThreaded engine = ((ChunkProviderServer) world.getChunkSource()).getLightEngine();
#else
        LightEngineThreaded engine = ((ChunkProviderServer) world.getChunkProvider()).getLightEngine();
#endif
        return com.bergerkiller.generated.net.minecraft.server.level.LightEngineThreadedHandle.createHandle(engine);
    }
}