// Recuerda que pedidos ya se imprimieron, para no repetir papel entre
// reinicios ni entre el canal en vivo y el barrido de respaldo.
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';

export class Ledger {
  private ids = new Set<string>();
  private ruta: string;

  constructor(carpeta: string) {
    mkdirSync(carpeta, { recursive: true });
    this.ruta = join(carpeta, 'impresos.json');
    try {
      const arr = JSON.parse(readFileSync(this.ruta, 'utf8')) as unknown;
      if (Array.isArray(arr)) for (const x of arr) this.ids.add(String(x));
    } catch {
      /* primer arranque: sin historial */
    }
  }

  tiene(id: string): boolean {
    return this.ids.has(id);
  }

  /** ¿Hay alguna marca con este prefijo? (saber si una funcion ya estreno). */
  algunoConPrefijo(prefijo: string): boolean {
    for (const id of this.ids) if (id.startsWith(prefijo)) return true;
    return false;
  }

  marcar(id: string): void {
    this.ids.add(id);
    // Tope de memoria/disco: con 5000 pedidos recordados sobra (el barrido solo mira 6h).
    const recientes = [...this.ids].slice(-5000);
    this.ids = new Set(recientes);
    try {
      writeFileSync(this.ruta, JSON.stringify(recientes));
    } catch {
      /* disco lleno o sin permiso: en memoria igual no se duplica */
    }
  }
}
