package eu.mhsl.minenet.minigames.instance.game.stateless.types.boatRace;

import eu.mhsl.minenet.minigames.Resource;
import eu.mhsl.minenet.minigames.handler.global.PlayerLoginHandler;
import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.score.FirstWinsScore;
import eu.mhsl.minenet.minigames.util.CommonProperties;
import net.minestom.server.MinecraftServer;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.GameMode;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.anvil.AnvilLoader;
import net.minestom.server.instance.block.Block;
import org.jetbrains.annotations.NotNull;

import java.util.concurrent.CompletableFuture;


public class BoatRace extends StatelessGame {
    public BoatRace() {
        super(Dimension.OVERWORLD.key, "boatRace", new FirstWinsScore());
        this.setChunkLoader(new AnvilLoader(Resource.GAME_MAP.getPath().resolve("boatRace/woodlandMansion")));
    }

    @Override
    protected boolean onPlayerJoin(Player p) {
        Entity boat = new Entity(EntityType.OAK_BOAT);
        boat.setInstance(this, this.getSpawn());
        boat.setSynchronizationTicks(100000);
        PlayerLoginHandler.globalTeam.addMember(boat.getUuid().toString());
        MinecraftServer.getSchedulerManager().scheduleNextTick(() -> boat.addPassenger(p));
        return super.onPlayerJoin(p);
    }

    @Override
    protected void onLoad(@NotNull CompletableFuture<Void> callback) {
        for(int z = 9; z <= 32; z++) {
            this.setBlock(31, 235, z, Block.CHERRY_FENCE.withProperties(CommonProperties.fenceNorthSouth));
        }
    }

    @Override
    protected void onStart() {
        for(int z = 9; z <= 32; z++) {
            this.setBlock(31, 235, z, Block.AIR);
        }
    }

    @Override
    protected void onPlayerMove(@NotNull PlayerMoveEvent event) {
        if (this.isBeforeBeginning) return;

        if(event.getNewPosition().z() > 469) {
            Player player = event.getPlayer();
            this.getScore().insertResult(player);

            Entity vehicle = player.getVehicle();
            if(vehicle != null) {
                vehicle.removePassenger(player);
                player.teleport(player.getPosition().withY(y -> y + 3));
                player.setGameMode(GameMode.SPECTATOR);
                vehicle.remove();
            }
        }
    }

    @Override
    public Pos getSpawn() {
        return new Pos(20, 236, 20, -90, 0);
    }
}
