import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import '../../../core/api/api_client.dart';
import '../../boloes/data/convite_pendente.dart';
import 'sessao_controller.dart';
import '../../../core/tema/marca.dart';

/// Cadastro com o mínimo de campos.
///
/// Está no caminho crítico do convite: cada campo a mais é participante que não
/// entra, e o casual chega com o prazo estourando.
class CadastroPage extends ConsumerStatefulWidget {
  const CadastroPage({super.key});

  @override
  ConsumerState<CadastroPage> createState() => _CadastroPageState();
}

class _CadastroPageState extends ConsumerState<CadastroPage> {
  final _form = GlobalKey<FormState>();
  final _email = TextEditingController();
  final _senha = TextEditingController();
  final _nome = TextEditingController();

  bool _enviando = false;
  String? _erroServidor;

  /// Mesmo mínimo do backend. Divergir faria o app aceitar o que o servidor
  /// recusa, e o participante veria erro sem saber o que corrigir.
  static const minimoSenha = 8;

  @override
  void dispose() {
    _email.dispose();
    _senha.dispose();
    _nome.dispose();
    super.dispose();
  }

  Future<void> _enviar() async {
    setState(() => _erroServidor = null);
    if (!_form.currentState!.validate()) return;

    setState(() => _enviando = true);
    try {
      await ref
          .read(sessaoProvider.notifier)
          .cadastrar(
            email: _email.text.trim(),
            senha: _senha.text,
            nomeExibicao: _nome.text.trim(),
          );
      // Navegação é do router, que observa o estado da sessão.
    } on ApiError catch (e) {
      // O que foi digitado permanece: falha de rede não pode custar o formulário.
      if (mounted) setState(() => _erroServidor = e.mensagem);
    } finally {
      if (mounted) setState(() => _enviando = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Criar conta')),
      body: SafeArea(
        child: SingleChildScrollView(
          padding: const EdgeInsets.all(24),
          child: Form(
            key: _form,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                const Padding(
                  padding: EdgeInsets.only(top: 8, bottom: 28),
                  child: MarcaRaro(produto: 'bolão'),
                ),
                // Quem chegou por convite precisa saber que o convite não se
                // perdeu — senão desiste no meio do cadastro e volta ao WhatsApp
                // para copiar o código de novo (AC-1 FE-4).
                if (ref.watch(convitePendenteProvider) != null) ...[
                  Container(
                    padding: const EdgeInsets.all(12),
                    decoration: BoxDecoration(
                      color: Theme.of(context).colorScheme.secondaryContainer,
                      borderRadius: BorderRadius.circular(8),
                    ),
                    child: const Text(
                      'Você foi convidado para um bolão. Crie sua conta e a '
                      'gente te coloca lá dentro na sequência.',
                      style: TextStyle(fontSize: 13),
                    ),
                  ),
                  const SizedBox(height: 20),
                ],
                TextFormField(
                  controller: _nome,
                  textInputAction: TextInputAction.next,
                  decoration: const InputDecoration(
                    labelText: 'Seu nome no ranking',
                    helperText: 'É como a galera vai te ver',
                  ),
                  validator: (v) => (v == null || v.trim().length < 2)
                      ? 'informe o nome que vai aparecer no ranking'
                      : null,
                ),
                const SizedBox(height: 16),
                TextFormField(
                  controller: _email,
                  keyboardType: TextInputType.emailAddress,
                  autocorrect: false,
                  textInputAction: TextInputAction.next,
                  decoration: const InputDecoration(labelText: 'E-mail'),
                  validator: (v) {
                    final t = v?.trim() ?? '';
                    if (t.isEmpty) return 'informe seu e-mail';
                    if (!t.contains('@') || !t.contains('.')) {
                      return 'e-mail inválido';
                    }
                    return null;
                  },
                ),
                const SizedBox(height: 16),
                TextFormField(
                  controller: _senha,
                  obscureText: true,
                  decoration: const InputDecoration(
                    labelText: 'Senha',
                    helperText: 'Mínimo de $minimoSenha caracteres',
                  ),
                  validator: (v) => (v == null || v.length < minimoSenha)
                      ? 'a senha precisa ter no mínimo $minimoSenha caracteres'
                      : null,
                  onFieldSubmitted: (_) => _enviar(),
                ),
                if (_erroServidor != null) ...[
                  const SizedBox(height: 16),
                  _AvisoErro(_erroServidor!),
                ],
                const SizedBox(height: 8),
                // Sem recuperação de senha nesta versão: não prometer o que não
                // existe, e avisar que a senha precisa ser guardada.
                const Padding(
                  padding: EdgeInsets.symmetric(vertical: 8),
                  child: Text(
                    'Guarde bem sua senha: nesta versão não há recuperação por '
                    'e-mail.',
                    style: TextStyle(fontSize: 12),
                  ),
                ),
                const SizedBox(height: 8),
                FilledButton(
                  onPressed: _enviando ? null : _enviar,
                  child: _enviando
                      ? const SizedBox(
                          height: 20,
                          width: 20,
                          child: CircularProgressIndicator(strokeWidth: 2),
                        )
                      : const Text('Criar conta e entrar'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class _AvisoErro extends StatelessWidget {
  const _AvisoErro(this.mensagem);
  final String mensagem;

  @override
  Widget build(BuildContext context) {
    final cor = Theme.of(context).colorScheme.error;
    return Container(
      padding: const EdgeInsets.all(12),
      decoration: BoxDecoration(
        border: Border.all(color: cor),
        borderRadius: BorderRadius.circular(8),
      ),
      child: Row(
        children: [
          Icon(Icons.error_outline, color: cor, size: 20),
          const SizedBox(width: 8),
          Expanded(
            child: Text(mensagem, style: TextStyle(color: cor)),
          ),
        ],
      ),
    );
  }
}
