import blessed from 'blessed';
import contrib from 'blessed-contrib';


/**
 * Une classe qui étend `blessed-contrib.tree` pour émettre
 * un événement 'hover' lorsque la sélection change.
 */
export class ObservableTree extends contrib.tree {
  constructor(options) {
    super(options);

    // Stocke la référence au nœud actuellement survolé
    this.hoveredNode = null;

    // Écoute les événements de sélection pour les touches de navigation
    this.on('keypress', (ch, key) => {
        console.log('keypress');
      // Les événements 'up' et 'down' sont gérés nativement par la classe parente.
      // Nous devons donc attendre la fin de leur exécution pour récupérer le nouveau nœud.
      if (key.name === 'up' || key.name === 'down') {
        process.nextTick(() => {
          this.emitHoverEvent();
        });
      }
    });

    // Écoute les clics de souris
    this.on('mouse', (data) => {
        console.log('mouse');
      if (data.action === 'mousedown') {
        const item = this.getItem(data.y);
        if (item) {
          const content = item.content.trim();
          if (content) {
            // Un clic de souris est un "select" dans la logique de blessed,
            // mais on peut le traiter comme un hover avant la validation.
            // On s'assure de ne pas émettre l'événement si le nœud n'a pas changé.
            this.emitHoverEvent(content);
          }
        }
      }
    });
  }

  /**
   * Émet l'événement 'hover' si le nœud survolé a changé.
   * @param {string} newLabel Le label du nouveau nœud survolé (optionnel pour les clics).
   */
  emitHoverEvent(newLabel) {
    console.log('emitHoverEvent');
    const currentNode = this.rows.items[this.rows.selected];
    const newHoveredNode = currentNode ? currentNode.content : null;

    // Si un label est passé (via la souris), l'utiliser
    if (newLabel && newLabel !== newHoveredNode) {
      // Pour les clics, on doit d'abord mettre à jour le nœud sélectionné de la liste.
      this.rows.select(this.rows.items.findIndex(item => item.content.trim() === newLabel.trim()));
    }

    if (newHoveredNode !== this.hoveredNode) {
      this.hoveredNode = newHoveredNode;
      this.emit('hover', this.hoveredNode);
    }
  }
}

/*
// --- Exemple d'utilisation ---

const screen = blessed.screen({ smartCSR: true });
screen.key(['escape', 'q', 'C-c'], () => process.exit(0));

// Crée une instance de notre nouvelle classe
const myTree = new ObservableTree({
  parent: screen,
  top: 'center',
  left: 'center',
  width: '50%',
  height: '50%',
  keys: true,
  vi: true,
  mouse: true,
  border: 'line',
  style: {
    selected: { bg: 'blue' }
  }
});

// Crée des données de test
myTree.setData({
  name: 'Root',
  children: {
    'item1': { name: 'item1', children: { 'subitem1': { name: 'subitem1' } } },
    'item2': { name: 'item2' },
    'item3': { name: 'item3' }
  }
});

// Écoute l'événement 'hover' que nous avons créé
myTree.on('hover', (nodeContent) => {
  screen.log(`Nœud survolé : ${nodeContent}`);
  screen.render();
});

// Focuse le composant et rend l'écran
myTree.focus();
screen.render();
*/