package de.steamwar.bausystem.commands;

import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.WorldeditWrapper;
import de.steamwar.bausystem.world.Welt;
import de.steamwar.bausystem.world.regions.*;
import de.steamwar.command.SWCommand;
import lombok.Getter;
import org.bukkit.entity.Player;


public class CommandSelect extends SWCommand {

    @Getter
    private static CommandSelect instance = null;

    public CommandSelect() {
        super("select");
    }

    {
        instance = this;
    }

    @Register(help = true)
    public void genericHelp(Player p, String... args) {
        p.sendMessage("§8/§eselect §8[§7RegionsTyp§8] §8- §7Wähle einen RegionsTyp aus");
        p.sendMessage("§8/§eselect §8[§7RegionsTyp§8] §8[§7Extension§8] §8- §7Wähle einen RegionsTyp aus mit oder ohne Extension");
    }

    @Register
    public void baurahmenCommand(Player p, RegionType regionType) {
        if (!permissionCheck(p)) {
            return;
        }

        Region region = Region.getRegion(p.getLocation());

        if (GlobalRegion.isGlobalRegion(region)) {
            p.sendMessage(BauSystem.PREFIX + "§cDie globale Region kannst du nicht auswählen");
            return;
        }

        if (regionType == RegionType.TESTBLOCK) {
            if (!region.hasTestblock()) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keinen Testblock");
                return;
            }
            setSelection(regionType, RegionExtensionType.NORMAL, region, p);
            return;
        }

        if (regionType == RegionType.BUILD) {
            if (!region.hasBuildRegion()) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keinen BuildArea");
                return;
            }
            setSelection(regionType, RegionExtensionType.NORMAL, region, p);
            return;
        }

        setSelection(regionType, RegionExtensionType.NORMAL, region, p);
    }

    @Register
    public void baurahmenCommand(Player p, RegionType regionType, RegionExtensionType regionExtensionType) {
        if (!permissionCheck(p)) {
            return;
        }

        Region region = Region.getRegion(p.getLocation());

        if (GlobalRegion.isGlobalRegion(region)) {
            p.sendMessage(BauSystem.PREFIX + "§cDie globale Region kannst du nicht auswählen");
            return;
        }

        if (regionType == RegionType.TESTBLOCK) {
            if (!region.hasTestblock()) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keinen Testblock");
                return;
            }
            if (regionExtensionType == RegionExtensionType.EXTENSION && !region.hasExtensionArea(regionType)) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keine Ausfahrmaße");
                return;
            }
            setSelection(regionType, regionExtensionType, region, p);
            return;
        }

        if (regionType == RegionType.BUILD) {
            if (!region.hasBuildRegion()) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keinen BuildArea");
                return;
            }
            if (regionExtensionType == RegionExtensionType.EXTENSION && !region.hasExtensionArea(regionType)) {
                p.sendMessage(BauSystem.PREFIX + "§cDiese Region hat keine Ausfahrmaße");
                return;
            }
            setSelection(regionType, regionExtensionType, region, p);
            return;
        }

        setSelection(regionType, regionExtensionType, region, p);
    }


    private boolean permissionCheck(Player player) {
        if (Welt.noPermission(player, Permission.WORLDEDIT)) {
            player.sendMessage(BauSystem.PREFIX + "§cDu darfst hier nicht den Select verwenden");
            return false;
        }
        return true;
    }

    private void setSelection(RegionType regionType, RegionExtensionType regionExtensionType, Region region, Player p) {
        Point minPoint = region.getMinPoint(regionType, regionExtensionType);
        Point maxPoint = region.getMaxPoint(regionType, regionExtensionType);

        WorldeditWrapper.impl.setSelection(p, minPoint, maxPoint);
        p.sendMessage(BauSystem.PREFIX + "WorldEdit auswahl auf " + minPoint.getX() + ", " + minPoint.getY() + ", " + minPoint.getZ() + " und " + maxPoint.getX() + ", " + maxPoint.getY() + ", " + maxPoint.getZ() + " gesetzt");
    }
}