package top.r3944realms.lib39.core.sync;

import net.minecraft.resources.Identifier;
import net.minecraft.world.entity.Entity;
import net.neoforged.neoforge.capabilities.ICapabilityProvider;
import org.jetbrains.annotations.Nullable;
import top.r3944realms.lib39.platform.Services;

/**
 * NeoForge 版本的能力提供者
 *
 * @param <T> 同步数据类型，必须继承 NBTEntitySyncData
 */
public abstract class SyncCapProvider<T extends NBTEntitySyncData> implements ICapabilityProvider<Entity, Void, T> {
    /**
     * 创建空的能力实例
     * 当管理器中不存在数据时调用
     *
     * @param entity 实体
     * @return 空的能力实例
     */
    protected abstract T createEmptyCapability(Entity entity);

    /**
     * 获取能力对应的 ID
     *
     * @return 能力 ID
     */
    protected abstract Identifier getId();

    @SuppressWarnings("unchecked")
    @Override
    public @Nullable T getCapability(Entity holder, Void context) {
        // 从管理器中获取对应的管理器
        return Services.PLATFORM.getUtilHelper().getSyncData2Manager().getManager(getId())
                .map(manager -> {
                    // 从管理器的同步映射中获取数据
                    ISyncData<?> syncData = manager.getSyncMap().get(holder.getUUID());
                    if (syncData instanceof NBTEntitySyncData nbtSyncData) {
                        return (T) nbtSyncData;
                    }
                    // 不存在则创建空实例
                    T defaultCap = createEmptyCapability(holder);
                    // 加载已有的同步数据（如果有）
                    if (holder instanceof ILib39SyncDataHolder syncHolder) {
                        syncHolder.loadSyncData(defaultCap);
                    }
                    // 注册到管理器
                    manager.getSyncMap().put(holder.getUUID(), defaultCap);
                    return defaultCap;
                })
                .orElseGet(() -> createEmptyCapability(holder));
    }
}
