<?php

namespace BanSystem;

use BanSystem\Command\BanCommand;
use BanSystem\Command\BanIPCommand;
use BanSystem\Command\BanCIDCommand;
use BanSystem\Command\BanListCommand;
use BanSystem\Command\KickCommand;
use BanSystem\Command\MuteCommand;
use BanSystem\Command\MuteListCommand;
use BanSystem\Command\TempBanCommand;
use BanSystem\Command\TempMuteCommand;
use BanSystem\Command\UnbanCommand;
use BanSystem\Command\UnbanIPCommand;
use BanSystem\Command\UnmuteCommand;
use BanSystem\Command\UnbanCIDCommand;
use BanSystem\BSListener\PlayerChatListener;
use BanSystem\BSListener\PlayerPreLoginListener;

use pocketmine\event\Listener;
use pocketmine\permission\Permission;
use pocketmine\plugin\Plugin;
use pocketmine\plugin\PluginBase;

class Lemdy extends PluginBase {
    
    private function removeCommand(string $command) {
        $commandMap = $this->getServer()->getCommandMap();
        $cmd = $commandMap->getCommand($command);
        if ($cmd == null) {
            return;
        }
        $cmd->setLabel("");
        $cmd->unregister($commandMap);
    }
    
    private function initializeCommands() {
        $commands = array("ban", "banlist", "unban", "unban-ip", "ban-ip", "kick", "ban-cid", "unban-cid");
        for ($i = 0; $i < count($commands); $i++) {
            $this->removeCommand($commands[$i]);
        }
        $commandMap = $this->getServer()->getCommandMap();
        $commandMap->registerAll("glowstone", array(
            new BanCommand(),
            new BanIPCommand(),
            new BanCIDCommand(),
            new BanListCommand(),
            new KickCommand(),
            new MuteCommand(),
            new MuteListCommand(),
            new TempBanCommand(),
            new TempMuteCommand(),
            new UnbanCommand(),
            new UnbanIPCommand(),
            new UnbanCIDCommand(),
            new UnmuteCommand()
        ));
    }
    
    protected function addPermissions(array $permissions) {
        foreach ($permissions as $permission) {
            $this->getServer()->getPluginManager()->addPermission($permission);
        }
    }
    
    protected function registerListeners(Plugin $plugin, array $listeners) {
        foreach ($listeners as $listener) {
            $this->getServer()->getPluginManager()->registerEvents($listener, $plugin);
        }
    }
    
    private function initializeListeners() {
        $this->registerListeners($this, array(
            new PlayerChatListener(),
            new PlayerPreLoginListener()
        ));
    }
    
    private function initializeFiles() {
        @mkdir($this->getDataFolder());
        if (!(file_exists("muted-players.txt") && is_file("muted-players.txt"))) {
            @fopen("muted-players.txt", "w+");
        }
    }
    
    private function initializePermissions() {
        $this->addPermissions(array(
            new Permission("bansystem.command.ban", "Позволяет закрыть доступ игроку на сервер", Permission::DEFAULT_OP),
            new Permission("bansystem.command.banip", "Позволяет закрыть доступ IP-адресу на сервер", Permission::DEFAULT_OP),
            new Permission("bansystem.command.banlist", "Позволяет посмотреть список забаненных игроков", Permission::DEFAULT_OP),
            new Permission("bansystem.command.kick", "Позволяет выкинуть игрока с сервера", Permission::DEFAULT_OP),
            new Permission("bansystem.command.bancid", "Позволяет забанить игрока по CID", Permission::DEFAULT_OP),
            new Permission("bansystem.command.mute", "Позволяет заткнуть игрока в чате", Permission::DEFAULT_OP),
            new Permission("bansystem.command.mutelist", "Позволяет посмотреть список заткнувшихся игроков", Permission::DEFAULT_OP),
            new Permission("bansystem.command.tempban", "Позволяет на время закрыть доступ игроку на сервер", Permission::DEFAULT_OP),
           new Permission("bansystem.command.tempmute", "Позволяет на время закрыть доступ игроку к чату", Permission::DEFAULT_OP),
            new Permission("bansystem.command.unban", "Позволяет дать игроку доступ на сервер", Permission::DEFAULT_OP),
            new Permission("bansystem.command.unbancid", "Позволяет разбанить игрока по CID", Permission::DEFAULT_OP),
            new Permission("bansystem.command.unbanip", "Позволяет дать IP-адресу доступ на сервера", Permission::DEFAULT_OP),
            new Permission("bansystem.command.unmute", "Позволяет дать игроку доступ в чат", Permission::DEFAULT_OP)
        ));
    }
    
    private function removeBanExpired() {
        $this->getServer()->getNameBans()->removeExpired();
        $this->getServer()->getIPBans()->removeExpired();
        Manager::getNameMutes()->removeExpired();
    }
    
    public function onEnable() {
        $this->initializeCommands();
        $this->initializeListeners();
        $this->initializePermissions();
        $this->initializeFiles();
        $this->removeBanExpired();
    }
}