package com.spaceshipproject;

import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;

import java.util.ArrayList;
import java.util.List;

/**
 * Cree, identifie et met a jour les boussoles "telecommande" de spaceship.
 * Chaque boussole porte dans son PersistentDataContainer l'id du spaceship associe.
 */
public class RemoteManager {

    private final SpaceShipProject plugin;
    private final NamespacedKey shipIdKey;
    private final NamespacedKey markerKey;

    public RemoteManager(SpaceShipProject plugin) {
        this.plugin = plugin;
        this.shipIdKey = new NamespacedKey(plugin, "spaceship_id");
        this.markerKey = new NamespacedKey(plugin, "spaceship_remote");
    }

    public NamespacedKey getShipIdKey() { return shipIdKey; }
    public NamespacedKey getMarkerKey() { return markerKey; }

    /** True si l'item est une telecommande SpaceShipProject. */
    public boolean isRemote(ItemStack item) {
        if (item == null || item.getType() != Material.RECOVERY_COMPASS) return false;
        ItemMeta meta = item.getItemMeta();
        if (meta == null) return false;
        return meta.getPersistentDataContainer().has(markerKey, PersistentDataType.BYTE);
    }

    /** Lit l'id du spaceship associe a la telecommande, ou -1. */
    public long getShipId(ItemStack item) {
        if (!isRemote(item)) return -1;
        ItemMeta meta = item.getItemMeta();
        Long id = meta.getPersistentDataContainer().get(shipIdKey, PersistentDataType.LONG);
        return id == null ? -1 : id;
    }

    /** Construit une telecommande pour le spaceship donne. */
    public ItemStack buildRemote(Spaceship ship) {
        ItemStack item = new ItemStack(Material.RECOVERY_COMPASS);
        ItemMeta meta = item.getItemMeta();
        if (meta == null) return item;

        PersistentDataContainer pdc = meta.getPersistentDataContainer();
        pdc.set(markerKey, PersistentDataType.BYTE, (byte) 1);
        pdc.set(shipIdKey, PersistentDataType.LONG, ship.getId());

        applyDisplay(meta, ship);

        item.setItemMeta(meta);
        return item;
    }

    /**
     * Reconstruit la telecommande sur place (apres renommage par exemple).
     * Conserve la quantite et l'emplacement de l'item.
     */
    public void refreshRemote(ItemStack item, Spaceship ship) {
        if (!isRemote(item) || ship == null) return;
        ItemMeta meta = item.getItemMeta();
        if (meta == null) return;
        applyDisplay(meta, ship);
        item.setItemMeta(meta);
    }

    private void applyDisplay(ItemMeta meta, Spaceship ship) {
        meta.setDisplayName(ConfigManager.color("&b&l\u2730 &fTelecommande &7- &b" + ship.getName()));
        List<String> lore = new ArrayList<>();
        lore.add(ConfigManager.color("&7ID : &f#" + ship.getId()));
        lore.add(ConfigManager.color("&7Niveau : &e" + ship.getLevel()));
        lore.add(ConfigManager.color("&7Taille : &f" + ship.getSizeX() + "x" + ship.getSizeY() + "x" + ship.getSizeZ()));
        lore.add("");
        lore.add(ConfigManager.color("&eClic gauche &8: &7invoquer / decharger"));
        lore.add(ConfigManager.color("&eClic droit &8: &7monter / redescendre"));
        lore.add(ConfigManager.color("&eShift + clic droit &8: &7parametres"));
        meta.setLore(lore);
    }
}
