package com.xfestudio.mydimensionlord.platform;

import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.saveddata.SavedData;
import net.minecraft.world.level.storage.DimensionDataStorage;
import net.minecraftforge.server.ServerLifecycleHooks;
import java.util.function.Function;
import java.util.function.Supplier;

public final class PlatformData {
    private PlatformData() {}
    public static HolderLookup.Provider registries() {
        MinecraftServer server = ServerLifecycleHooks.getCurrentServer();
        return server == null ? RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY) : server.registryAccess();
    }
    public static HolderLookup.Provider registries(BlockEntity entity) {
        return entity.getLevel() == null ? registries() : entity.getLevel().registryAccess();
    }
    public static CompoundTag saveStack(ItemStack stack) { return (CompoundTag) stack.saveOptional(registries()); }
    public static ItemStack readStack(CompoundTag tag) { return ItemStack.parseOptional(registries(), tag); }
    public static <T extends PortableSavedData> T savedData(DimensionDataStorage storage, String name,
                                                           Supplier<T> factory, Function<CompoundTag, T> loader) {
        return storage.computeIfAbsent(new SavedData.Factory<>(factory, (tag, registries) -> loader.apply(tag)), name);
    }
}
