/// Extrai o token do convite a partir do que a pessoa colou no campo.
///
/// O que circula no grupo do WhatsApp é o **link**
/// (`bolao://bolao.app/convite/<token>`), não o código solto — então colar o
/// link inteiro no campo "código do convite" é o erro mais provável de todos,
/// e não é nem erro: é a pessoa usando o que recebeu.
///
/// Sem esta normalização o servidor procura o hash do texto colado, não acha, e
/// responde "convite inválido ou já substituído": um diagnóstico **errado**
/// sobre um convite válido, no ponto mais frágil do funil de entrada.
String tokenDeConvite(String colado) {
  var t = colado.trim();

  // Link (com ou sem esquema): o token é o que vem depois de `/convite/`.
  const marca = '/convite/';
  final i = t.lastIndexOf(marca);
  if (i >= 0) t = t.substring(i + marca.length);

  // Link colado no meio de uma frase ("entra aqui: bolao://... valeu").
  t = t.split(RegExp(r'\s')).first;

  // Query/fragmento que algum app de mensagem anexa ao encaminhar.
  t = t.split('?').first.split('#').first;

  // Simétrico ao `Uri.encodeComponent` do compartilhamento. Percentual solto
  // (texto colado torto, "100%desconto") não pode virar exceção: devolve o que
  // veio e deixa o servidor recusar com a mensagem dele. `decodeComponent`
  // lança `FormatException` para byte de continuação faltando e `ArgumentError`
  // para percentual malformado — os dois têm que ser absorvidos.
  try {
    return Uri.decodeComponent(t);
  } on FormatException {
    return t;
  } on ArgumentError {
    return t;
  }
}
