/**
 * Utilitários para cálculo de fases desbloqueadas.
 *
 * Centraliza as três implementações paralelas de lógica de unlock dispersas
 * em SeletorDeFases, AtividadesSidebar e GameStateContext.
 *
 * @module utils.phaseUtils
 */

/**
 * Retorna o array de números de fases desbloqueadas para jogos (fases numéricas, 1-based).
 *
 * Regra: a fase 1 está sempre desbloqueada. Após completar uma fase, a próxima
 * é desbloqueada. O array retornado contém todas as fases de 1 até a última desbloqueada.
 *
 * @param {number[]} completedPhases - Array com números das fases já concluídas
 * @param {number} totalPhases - Total de fases disponíveis no jogo
 * @returns {number[]} Array de números de fases desbloqueadas (começa em 1)
 *
 * @example
 * getUnlockedPhases([], 5);        // [1]
 * getUnlockedPhases([1], 5);       // [1, 2]
 * getUnlockedPhases([1, 2, 3], 5); // [1, 2, 3, 4]
 * getUnlockedPhases([1, 2, 3, 4, 5], 5); // [1, 2, 3, 4, 5]
 */
export function getUnlockedPhases(completedPhases, totalPhases) {
  if (!completedPhases || completedPhases.length === 0) return [1];
  const maxCompleted = Math.max(...completedPhases);
  return Array.from(
    { length: Math.min(maxCompleted + 1, totalPhases) },
    (_, i) => i + 1,
  );
}

/**
 * Retorna o array de IDs de atividades desbloqueadas para letramento (IDs string).
 *
 * Regra: a primeira atividade da lista está sempre desbloqueada. Após completar
 * uma atividade, a seguinte na ordem da lista é desbloqueada.
 *
 * @param {string[]} completedIds - Array com IDs das atividades já concluídas
 * @param {{ id: string }[]} orderedAtividades - Array de atividades na ordem de exibição
 * @returns {string[]} Array de IDs das atividades desbloqueadas
 *
 * @example
 * const atividades = [{ id: 'a' }, { id: 'b' }, { id: 'c' }];
 * getUnlockedAtividades([], atividades);        // ['a']
 * getUnlockedAtividades(['a'], atividades);     // ['a', 'b']
 * getUnlockedAtividades(['a', 'b'], atividades); // ['a', 'b', 'c']
 */
export function getUnlockedAtividades(completedIds, orderedAtividades) {
  if (!completedIds || completedIds.length === 0) {
    return orderedAtividades.length > 0 ? [orderedAtividades[0].id] : [];
  }

  const unlocked = new Set(completedIds);
  const maxCompletedIndex = Math.max(
    ...completedIds.map((id) => orderedAtividades.findIndex((a) => a.id === id)),
  );

  if (maxCompletedIndex >= 0 && maxCompletedIndex + 1 < orderedAtividades.length) {
    unlocked.add(orderedAtividades[maxCompletedIndex + 1].id);
  }

  return Array.from(unlocked);
}
