package net.dzikoysk.funnyguilds.system.security;

import net.dzikoysk.funnyguilds.FunnyGuilds;
import net.dzikoysk.funnyguilds.basic.guild.Guild;
import net.dzikoysk.funnyguilds.basic.guild.Region;
import net.dzikoysk.funnyguilds.basic.user.User;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.List;

public final class SecuritySystem {

    private static SecuritySystem instance;
    private final List<User> blocked;

    public SecuritySystem() {
        instance = this;
        blocked = new ArrayList<>();
    }

    public static SecuritySystem getSecurity() {
        if (instance == null) {
            new SecuritySystem();
        }
        
        return instance;
    }

    public boolean checkPlayer(Player player, Object... values) {
        for (SecurityType type : SecurityType.values()) {
            if (checkPlayer(player, type, values)) {
                return true;
            }
        }
        
        return false;
    }

    public boolean checkPlayer(Player player, SecurityType type, Object... values) {
        if (! FunnyGuilds.getInstance().getPluginConfiguration().regionsEnabled) {
            return false;
        }
        
        if (isBanned(User.get(player))) {
            return true;
        }
        
        switch (type) {
            case FREECAM:
                Guild guild = null;

                for (Object value : values) {
                    if (value instanceof Guild) {
                        guild = (Guild) value;
                    }
                }

                if (guild == null) {
                    return false;
                }

                Region region = guild.getRegion();

                if (region == null) {
                    return false;
                }

                int dis = (int) region.getCenter().distance(player.getLocation());

                if (dis < 6) {
                    return false;
                }
                
                for (Player w : Bukkit.getOnlinePlayers()) {
                    if (w.isOp()) {
                        w.sendMessage(SecurityUtils.getBustedMessage(player.getName(), "FreeCam"));
                        w.sendMessage(SecurityUtils.getNoteMessage("Zaatakowal krysztal z odleglosci &c" + dis + " kratek"));
                    }
                }
                
                blocked.add(User.get(player));
                return true;
            case EVERYTHING:
                break;
            default:
                break;
        }
        
        return false;
    }

    public boolean isBanned(User user) {
        return blocked.contains(user);
    }
}