/**
 * Cloud Functions do bolão.
 *
 * Vazio de propósito nesta etapa: `MG-1` monta a infraestrutura e prova que os
 * emuladores rodam. A regra de negócio chega em `MG-3` (sigilo e prazo) e `MG-5`
 * (apuração) — vinda dos services que já existem e já têm teste, não escrita de
 * novo.
 *
 * O `saude` existe só para o emulador de Functions ter o que carregar: sem
 * nenhuma função exportada, não há como verificar que o build e o carregamento
 * funcionam.
 */
import { initializeApp } from 'firebase-admin/app';
import { setGlobalOptions } from 'firebase-functions/v2';
import { onCall, onRequest } from 'firebase-functions/v2/https';

/**
 * Região das Functions: **a mesma do Firestore**.
 *
 * O padrão do Firebase é `us-central1`, e o deploy de fumaça de 07/08 caiu lá —
 * com o banco em São Paulo. Cada leitura da Function cruzaria o continente e
 * voltaria, na apuração e na sincronização, que são justamente as que fazem
 * muitas leituras. Função e banco em regiões diferentes é latência que não
 * aparece em teste local nenhum: no emulador tudo é localhost.
 */
setGlobalOptions({ region: 'southamerica-east1' });

// Uma única inicialização do Admin SDK para todas as Functions do arquivo.
initializeApp();

export { liberarSigiloQuandoJogoTermina } from './sigilo';
export { registrarRevisaoDoPalpite } from './revisao';
export { criarPerfilNoCadastro } from './perfil';
export { apurarJogo } from './apuracao';
export { sincronizarComAFonte } from './sincronizacao';
export { manterIndiceDoUsuario, propagarBolaoParaOIndice } from './indice';
export {
  criarBolao,
  listarCompeticoes,
  gerarConvite,
  invalidarConvite,
  entrarPorConvite,
} from './boloes';
export { alterarRegras, travarRegrasNoPrimeiroPalpite } from './regras';
export { corrigirPlacar } from './correcao';
export { extratoDaRodada, rankingDaRodada, statusDaRodada } from './extrato';
export { historicoDeBoloes } from './ciclo-vida';
export {
  encerrarBolao,
  encerrarBolaoAntecipadamente,
  arquivarBolao,
  recriarTemporada,
} from './ciclo-vida';
export {
  promoverAdmin,
  rebaixarAdmin,
  sairDoBolao,
  removerParticipante,
} from './membros';

/**
 * Hora do servidor, para a contagem de prazo do app.
 *
 * **O relógio do aparelho não decide prazo** (`PP-3`/`PP-5`): quem quiser
 * palpitar depois do apito é só adiantar o celular. O app pede esta hora uma vez
 * por sessão, guarda a diferença e conta a partir dela. Quem recusa de verdade é
 * a rule, que compara com `request.time` — isto aqui é para a tela não mentir.
 */
export const horaDoServidor = onCall(() => ({
  agora: new Date().toISOString(),
}));

export const saude = onRequest((_req, res) => {
  res.json({ ok: true, etapa: 'MG-1' });
});
