/**
 * @fileoverview Utility module for MatrixEffect.js
 * 
 * @module games.cripto.ui.MatrixEffect
 */

import { ConstantesAnimacao } from "./constants.js";

export default class MatrixEffect {
  constructor(scene, colunas) {
    this.scene = scene;
    this.colunas = colunas;

    this.caracteres = ConstantesAnimacao.MATRIX.CARACTERES_HEX;
    this.numCaracteres = ConstantesAnimacao.MATRIX.CARACTERES_POR_COLUNA;
    this.intervalo = ConstantesAnimacao.MATRIX.INTERVALO_ATUALIZACAO;

    // Controle de animação via update()
    this.acumulador = 0;

    // Gerar conteúdo inicial
    this.atualizarColunas();
  }

  gerarCaractereAleatorio() {
    return this.caracteres[Math.floor(Math.random() * this.caracteres.length)];
  }

  atualizarColuna(coluna) {
    const textoColuna = [];
    for (let i = 0; i < this.numCaracteres; i++) {
      textoColuna.push(this.gerarCaractereAleatorio());
    }
    coluna.setText(textoColuna.join("\n"));
  }

  atualizarColunas() {
    this.colunas.forEach((coluna) => this.atualizarColuna(coluna));
  }

  /**
   * Método chamado a cada frame do Phaser
   * @param {number} delta - Tempo decorrido desde o último frame (ms)
   */
  update(delta = 16) {
    this.acumulador += delta;

    // Atualizar apenas quando o intervalo for atingido
    if (this.acumulador >= this.intervalo) {
      this.atualizarColunas();
      this.acumulador = 0;
    }
  }
}
