import java.util.*;

public class ItemManager {
    private List<String> myCollection = new ArrayList<>();
    private Map<String, Collectable> itemDetails = new HashMap<>();
    private Set<String> tradedItems = new HashSet<>();
    private Set<String> duplicateItems = new HashSet<>();

    // Bulk add using names and item map
    public void addItemsBulk(List<String> newItems) {
        for (String name : newItems) {
            if (myCollection.contains(name)) {
                duplicateItems.add(name);
            } else {
                myCollection.add(name);
            }
        }
    }

    // Bulk remove using item names
    public void removeItemsBulk(List<String> itemsToRemove) {
        for (String name : itemsToRemove) {
            if (myCollection.remove(name)) {
                tradedItems.add(name);
                itemDetails.remove(name);
            }
        }
    }

    // Update value (rarity) of items by type (e.g., "epic") by %
    public void updateValuesByType(String type, int percentage) {
        for (Map.Entry<String, Collectable> entry : itemDetails.entrySet()) {
            Collectable item = entry.getValue();
            if (item.getType().equalsIgnoreCase(type)) {
                int updatedRarity = (int) Math.round(item.getRarity() * (1 + percentage / 100.0));
                setRarity(item, updatedRarity);
            }
        }
    }

    // Filter by rarity
    public Map<String, Collectable> filterByRarity(int rarity) {
        Map<String, Collectable> filtered = new HashMap<>();
        for (Map.Entry<String, Collectable> entry : itemDetails.entrySet()) {
            if (entry.getValue().getRarity() == rarity) {
                filtered.put(entry.getKey(), entry.getValue());
            }
        }
        return filtered;
    }

    // Display full collection
    public void displayCollection() {
        System.out.printf("%-20s %-15s %-10s%n", "Name", "Type", "Rarity");
        System.out.println("--------------------------------------------------");
        for (String name : myCollection) {
            Collectable item = itemDetails.getOrDefault(name, new Collectable(name, "Unknown", 0));
            System.out.printf("%-20s %-15s %-10d%n", 
                item.getName(), item.getType(), item.getRarity());
        }
    }

    // Helper to update rarity (since it's private)
    private void setRarity(Collectable item, int newRarity) {
        try {
            var field = Collectable.class.getDeclaredField("rarity");
            field.setAccessible(true);
            field.setInt(item, newRarity);
        } catch (Exception e) {
            System.err.println("Error updating rarity: " + e.getMessage());
        }
    }

    // Demo
    public static void main(String[] args) {
        ItemManager manager = new ItemManager();

        // Create some items
        Collectable sword = new Collectable("Sword", "common", 100);
        Collectable shield = new Collectable("Shield", "epic", 300);
        Collectable bow = new Collectable("Bow", "rare", 200);

        // Add to itemDetails
        manager.itemDetails.put(sword.getName(), sword);
        manager.itemDetails.put(shield.getName(), shield);
        manager.itemDetails.put(bow.getName(), bow);

        // Bulk add
        manager.addItemsBulk(List.of("Sword", "Shield", "Bow", "Sword"));

        // Bulk remove
        manager.removeItemsBulk(List.of("Bow"));

        // Update all epic items
        manager.updateValuesByType("epic", 10);

        // Filter by rarity
        Map<String, Collectable> filtered = manager.filterByRarity(330);
        System.out.println("\nFiltered Items (rarity 330):");
        filtered.values().forEach(System.out::println);

        // Display full collection
        System.out.println("\nFull Collection:");
        manager.displayCollection();

        // Show tracking sets
        System.out.println("\nDuplicate Items: " + manager.duplicateItems);
        System.out.println("Traded Items: " + manager.tradedItems);
    }
}