/*
 * This file is a part of the SteamWar software.
 *
 * Copyright (C) 2021  SteamWar.de-Serverteam
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package de.steamwar.bausystem.features.region;

import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.RegionUtils;
import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.bausystem.region.flags.flagvalues.TNTMode;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.bausystem.utils.ScoreboardElement;
import de.steamwar.linkage.Linked;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockExplodeEvent;
import org.bukkit.event.entity.EntityExplodeEvent;

import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

@Linked
public class TNTListener implements Listener, ScoreboardElement {

    private void explode(List<Block> blockList) {
        blockList.removeIf(block -> {
            Region region = Region.getRegion(block.getLocation());
            TNTMode value = region.getPlain(Flag.TNT);
            if (value == TNTMode.ALLOW) {
                return false;
            } else if (value == TNTMode.ONLY_TB) {
                if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.NORMAL)) {
                    RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY");
                    return true;
                }
                if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION)) {
                    RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY");
                    return true;
                }
            } else if (value == TNTMode.ONLY_BUILD) {
                if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.NORMAL)) {
                    RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY");
                    return true;
                }
                if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) {
                    RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY");
                    return true;
                }
            }
            return value == TNTMode.DENY;
        });
    }

    @EventHandler
    public void onBlockExplode(BlockExplodeEvent event) {
        explode(event.blockList());
    }

    @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
    public void onExplode(EntityExplodeEvent event) {
        explode(event.blockList());
    }

    @Override
    public ScoreboardGroup getGroup() {
        return ScoreboardGroup.REGION;
    }

    @Override
    public int order() {
        return 0;
    }

    @Override
    public String get(Region region, Player p) {
        return "§e" + BauSystem.MESSAGE.parse(Flag.TNT.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.TNT).getChatValue(), p);
    }
}
