import { MOUSE_ATIVIDADES_REGISTRY } from './mouse/mouseRegistry';
import { TECLADO_ATIVIDADES_REGISTRY } from './teclado/tecladoRegistry';

// Registry of available letramento (digital literacy) activities.
// Each category owns its own configuration file and this module only composes them.
export const ATIVIDADES_REGISTRY = {
  ...MOUSE_ATIVIDADES_REGISTRY,
  ...TECLADO_ATIVIDADES_REGISTRY,
};

/**
 * @param {string} id
 * @returns {Object|null}
 */
export function getAtividade(id) {
  return ATIVIDADES_REGISTRY[id] ?? null;
}

/**
 * @returns {Object[]}
 */
export function listarAtividades() {
  return Object.values(ATIVIDADES_REGISTRY);
}

/**
 * Lista atividades de uma categoria específica, ordenadas pela sequência da trilha
 * @param {string} categoria
 * @returns {Object[]}
 */
export function listarAtividadesPorCategoria(categoria) {
  const atividades = Object.values(ATIVIDADES_REGISTRY).filter(
    (atividade) => atividade.categoria === categoria
  );

  // Ordena pela sequência da trilha (começando pela que não aparece em 'proxima')
  const atividadesOrdenadas = [];
  const atividadesMap = new Map(atividades.map((a) => [a.id, a]));

  // Encontra a primeira atividade (que não é 'proxima' de nenhuma outra)
  const proximasIds = new Set(atividades.map((a) => a.proxima).filter(Boolean));
  const primeira = atividades.find((a) => !proximasIds.has(a.id));

  if (!primeira) return atividades; // Fallback caso haja ciclo

  let atual = primeira;
  while (atual && atividadesOrdenadas.length < atividades.length) {
    atividadesOrdenadas.push(atual);
    atual = atual.proxima ? atividadesMap.get(atual.proxima) : null;
  }

  return atividadesOrdenadas;
}
