/*
 *   This file is a part of the SteamWar software.
 *
 *   Copyright (C) 2025 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.misslewars.slowmo;

import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.craftbukkit.CraftWorld;

import java.lang.reflect.Field;

public class SlowMoUtils {

    private static final Field field;
    public static final boolean freezeEnabled;

    private static boolean frozen = false;

    private static final World world;

    static {
        Field temp;
        try {
            temp = ServerLevel.class.getField("freezed");
        } catch (NoSuchFieldException e) {
            temp = null;
        }
        field = temp;
        if (field != null) field.setAccessible(true);
        freezeEnabled = field != null;
        world = Bukkit.getWorlds().get(0);
    }

    public static void freeze() {
        setFreeze(world, true);
    }

    public static void unfreeze() {
        setFreeze(world, false);
    }

    public static boolean frozen() {
        return freezeEnabled && frozen;
    }

    private static void setFreeze(World world, boolean state) {
        if (freezeEnabled) {
            if (frozen == state) return;
            try {
                field.set(((CraftWorld) world).getHandle(), state);
                frozen = state;
            } catch (IllegalAccessException e) {
                // Ignored;
            }
        }
    }
}
