package net.mattias.cobblesnapshot.event;

import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
import com.cobblemon.mod.common.pokemon.Pokemon;
import net.mattias.cobblesnapshot.item.ModItems;
import net.minecraft.ChatFormatting;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.CustomData;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class CameraUseEvents {

    @net.neoforged.bus.api.SubscribeEvent
    public static void onEntityRightClick(PlayerInteractEvent.EntityInteractSpecific event) {
        // We only want to do this on the server to prevent consuming items twice.
        // The server will handle creating the item and synchronizing it to the client.
        if (event.getLevel().isClientSide()) return;

        if (!(event.getTarget() instanceof PokemonEntity target)) return;
        Player player = event.getEntity();
        ItemStack camera = player.getItemInHand(event.getHand());

        if (!camera.is(ModItems.CAMERA.get())) return;

        // Check for film in inventory
        int filmSlot = findFirstSlotWithItem(player, ModItems.FILM.get());
        if (filmSlot == -1) {
            player.sendSystemMessage(Component.literal("You need film to take a snapshot!").withStyle(ChatFormatting.RED));
            return;
        }

        // Get Pokémon data
        Pokemon pokemon = target.getPokemon();

        // Consume 1 film ONLY AFTER we know the operation is successful
        player.getInventory().removeItem(filmSlot, 1);

        // --- Create the Snapshot Item ---
        ItemStack snapshot = new ItemStack(ModItems.IMAGE_FILM.get());

        // Set custom name
        snapshot.set(DataComponents.CUSTOM_NAME, Component.literal("📸 Snapshot of " + pokemon.getDisplayName().getString()));

        // --- Store Metadata in CUSTOM_DATA ---
        CompoundTag tag = new CompoundTag();
        tag.putString("TakenBy", player.getName().getString());
        tag.putString("TakenOn", LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE));

        // Get the Pokémon's sprite location from Cobblemon and store it as a string
        ResourceLocation sprite = pokemon.getSprite();
        tag.putString("SpritePath", sprite.toString());

        // Apply the data to the item stack
        snapshot.set(DataComponents.CUSTOM_DATA, CustomData.of(tag));

        // Give item to player
        if (!player.addItem(snapshot)) {
            player.drop(snapshot, false);
        }

        player.sendSystemMessage(Component.literal("📸 You took a snapshot of " + pokemon.getDisplayName() + "!"));
        event.setCanceled(true);
        event.setCancellationResult(InteractionResult.SUCCESS);
    }

    private static int findFirstSlotWithItem(Player player, Item item) {
        for (int i = 0; i < player.getInventory().getContainerSize(); i++) {
            ItemStack stack = player.getInventory().getItem(i);
            if (stack.is(item)) return i;
        }
        return -1;
    }
}

Cannot resolve method 'getSprite' in 'Pokemon'

package net.mattias.cobblesnapshot.item.custom;

import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.inventory.tooltip.TooltipComponent;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.component.CustomData;

import java.util.List;
import java.util.Optional;

public class ImageFilmItem extends Item {
    public ImageFilmItem(Properties properties) {
        super(properties);
    }

    // This method adds the text lines to the tooltip
    @Override
    public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltip, TooltipFlag flag) {
        super.appendHoverText(stack, context, tooltip, flag);

        CustomData customData = stack.get(DataComponents.CUSTOM_DATA);
        if (customData != null) {
            CompoundTag tag = customData.copyTag(); // Use copyTag() to get the NBT
            if (tag.contains("TakenBy")) {
                tooltip.add(Component.literal("Taken by: " + tag.getString("TakenBy")));
            }
            if (tag.contains("TakenOn")) {
                tooltip.add(Component.literal("Taken on: " + tag.getString("TakenOn")));
            }
        }
    }

    // This new vanilla method adds an image to the tooltip
    @Override
    public Optional<TooltipComponent> getTooltipImage(ItemStack stack) {
        CustomData customData = stack.get(DataComponents.CUSTOM_DATA);
        if (customData != null) {
            CompoundTag tag = customData.copyTag();
            if (tag.contains("SpritePath")) {
                // Read the sprite path we saved earlier
                ResourceLocation spriteLocation = ResourceLocation.tryParse(tag.getString("SpritePath"));
                if (spriteLocation != null) {
                    // Return a TooltipImage object. The dimensions can be adjusted.
                    return Optional.of(new TooltipImage(spriteLocation, 64, 64));
                }
            }
        }
        return Optional.empty();
    }
}
Cannot resolve symbol 'TooltipImage'