/**
 * <ErroFatal> — o que aparece quando um ecrã rebenta.
 *
 * Sem isto, um erro de JavaScript em qualquer componente desmonta a árvore
 * toda e deixa **uma página em branco**. Quem está do outro lado não tem como
 * saber se a aplicação morreu, se a internet caiu, ou se carregou no sítio
 * errado — e não tem como sair dali a não ser recarregando às cegas.
 *
 * O React só apanha estes erros através de um componente de classe com
 * `componentDidCatch`. É a única classe do projecto, e é por isso.
 *
 * ## O que mostra, e o que não mostra
 *
 * Mostra a mensagem do erro. Não é para o utilizador perceber — é para poder
 * **dizer-nos** o que apareceu, em vez de "não funciona". Esconder isso só
 * torna o problema mais difícil de resolver para toda a gente.
 *
 * Não mostra a pilha de chamadas: essa vai para a consola, onde quem a sabe
 * ler a vai buscar.
 */
class ErroFatal extends React.Component {
  constructor(props) {
    super(props);
    this.state = { erro: null };
  }

  static getDerivedStateFromError(erro) {
    return { erro };
  }

  componentDidCatch(erro, info) {
    // A consola é onde isto fica até haver registo de erros do lado do servidor.
    console.error('[NetScreen] ecrã rebentou:', erro, info?.componentStack);
  }

  render() {
    if (!this.state.erro) return this.props.children;

    return (
      <div className="flex min-h-screen items-center justify-center p-6">
        <div className="w-full max-w-md">
          <div className="border border-border bg-card">
            <div className="h-0.5 bg-primary" aria-hidden="true" />
            <div className="p-8">
              <Logo size="md" />

              <p className="label-eyebrow mt-8">Erro</p>
              <h1 className="mt-1 font-display text-3xl leading-none">Este ecrã não abriu</h1>

              <p className="mt-4 text-sm text-muted-foreground">
                Alguma coisa correu mal a desenhar esta página. Não é problema teu, e nada do que
                tinhas feito se perdeu.
              </p>

              <p className="mt-4 border-l-2 border-border bg-muted px-3 py-2 font-mono text-xs text-foreground">
                {String(this.state.erro?.message || this.state.erro)}
              </p>

              <div className="mt-6 flex flex-wrap gap-2">
                <button
                  type="button"
                  onClick={() => window.location.reload()}
                  className="bg-primary px-4 py-2 text-sm uppercase tracking-wider text-primary-foreground outline-none hover:bg-primary/90 focus-visible:ring-1 focus-visible:ring-accent"
                >
                  Tentar outra vez
                </button>
                <a
                  href="/"
                  className="border border-border px-4 py-2 text-sm uppercase tracking-wider text-muted-foreground outline-none hover:text-foreground focus-visible:ring-1 focus-visible:ring-accent"
                >
                  Voltar ao início
                </a>
              </div>

              <p className="mt-6 text-xs text-muted-foreground">
                Se voltar a acontecer, diz-nos o que está escrito na caixa acima — é o que nos deixa
                encontrar isto depressa.
              </p>
            </div>
          </div>
        </div>
      </div>
    );
  }
}
