// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core.modules.camera;

import com.hypixel.hytale.protocol.Packet;
import com.hypixel.hytale.protocol.packets.camera.SetFlyCameraMode;
import java.util.Set;
import java.util.UUID;
import java.util.Iterator;
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.server.core.universe.Universe;
import com.hypixel.hytale.server.core.permissions.PermissionsModule;
import com.hypixel.hytale.event.EventBus;
import com.hypixel.hytale.server.core.event.events.permissions.GroupPermissionChangeEvent;
import com.hypixel.hytale.server.core.event.events.permissions.PlayerGroupEvent;
import com.hypixel.hytale.server.core.event.events.permissions.PlayerPermissionChangeEvent;
import com.hypixel.hytale.server.core.HytaleServer;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import javax.annotation.Nonnull;
import com.hypixel.hytale.common.plugin.PluginManifest;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class FlyCameraModule extends JavaPlugin
{
    @Nonnull
    public static final PluginManifest MANIFEST;
    
    public FlyCameraModule(@Nonnull final JavaPluginInit init) {
        super(init);
    }
    
    @Override
    protected void setup() {
        final EventBus eventBus = HytaleServer.get().getEventBus();
        eventBus.register(PlayerPermissionChangeEvent.PermissionsRemoved.class, this::handlePlayerPermissionsRemoved);
        eventBus.register(PlayerGroupEvent.Removed.class, this::handlePlayerGroupRemoved);
        eventBus.register(GroupPermissionChangeEvent.Removed.class, this::handleGroupPermissionsRemoved);
    }
    
    private void handlePlayerPermissionsRemoved(@Nonnull final PlayerPermissionChangeEvent.PermissionsRemoved event) {
        if (PermissionsModule.hasPermission(event.getRemovedPermissions(), "hytale.camera.flycam") == Boolean.TRUE) {
            this.checkAndEnforceFlyCameraPermission(event.getPlayerUuid());
        }
    }
    
    private void handlePlayerGroupRemoved(@Nonnull final PlayerGroupEvent.Removed event) {
        this.checkAndEnforceFlyCameraPermission(event.getPlayerUuid());
    }
    
    private void handleGroupPermissionsRemoved(@Nonnull final GroupPermissionChangeEvent.Removed event) {
        if (PermissionsModule.hasPermission(event.getRemovedPermissions(), "hytale.camera.flycam") != Boolean.TRUE) {
            return;
        }
        final String groupName = event.getGroupName();
        final PermissionsModule permissionsModule = PermissionsModule.get();
        for (final PlayerRef playerRef : Universe.get().getPlayers()) {
            final UUID uuid = playerRef.getUuid();
            final Set<String> groups = permissionsModule.getGroupsForUser(uuid);
            if (groups.contains(groupName)) {
                this.checkAndEnforceFlyCameraPermission(uuid);
            }
        }
    }
    
    private void checkAndEnforceFlyCameraPermission(@Nonnull final UUID uuid) {
        final PlayerRef playerRef = Universe.get().getPlayer(uuid);
        if (playerRef == null) {
            return;
        }
        final boolean hasPermission = PermissionsModule.get().hasPermission(uuid, "hytale.camera.flycam");
        if (!hasPermission) {
            playerRef.getPacketHandler().writeNoCache(new SetFlyCameraMode(false));
        }
    }
    
    static {
        MANIFEST = PluginManifest.corePlugin(FlyCameraModule.class).depends(PermissionsModule.class).build();
    }
}
