import { getFirestore } from 'firebase-admin/firestore';
import { logger } from 'firebase-functions';
import * as funcoesV1 from 'firebase-functions/v1';

/**
 * Cria o perfil (`usuarios/{uid}`) quando a conta nasce no Firebase Auth.
 *
 * A credencial fica no Auth; o **nome de exibição** e o e-mail ficam aqui, porque
 * é isso que o resto do produto lê — a lista de participantes, o ranking, o
 * extrato. Sem esse documento, quem se cadastra existe para o login e não existe
 * para o bolão.
 *
 * Por que Function e não escrita do app: o app **poderia** criar o próprio perfil
 * (a rule permite, é o caminho dele), mas se a criação falhar por rede logo depois
 * do cadastro, a conta fica sem perfil e a pessoa vira um participante sem nome. O
 * gatilho do Auth acontece do lado do servidor e não depende de o app continuar
 * aberto.
 *
 * **Gatilho v1 de propósito.** O equivalente v2 (`beforeUserCreated`) é *blocking
 * function* e exige Identity Platform; este gatilho roda no Firebase Auth puro.
 */
export const criarPerfilNoCadastro = funcoesV1
  .region('southamerica-east1')
  .auth.user()
  .onCreate(async (usuario) => {
    const db = getFirestore();
    const ref = db.doc(`usuarios/${usuario.uid}`);

    // `create` em vez de `set`: se o app já criou o perfil, não sobrescreve o
    // nome que a pessoa escolheu por um vazio vindo do Auth.
    const jaExiste = (await ref.get()).exists;
    if (jaExiste) {
      logger.info(`perfil de ${usuario.uid} já existia — nada a fazer`);
      return;
    }

    await ref.set({
      // O Auth só tem `displayName` se o cadastro o informou. Cair para o trecho
      // antes do @ é melhor que gravar vazio: participante sem nome no ranking é
      // uma linha que ninguém identifica.
      displayName: usuario.displayName || usuario.email?.split('@')[0] || 'Participante',
      email: usuario.email ?? '',
      createdAt: new Date(),
    });

    logger.info(`perfil criado para ${usuario.uid}`);
  });
