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

import '../../../core/api/api_client.dart';
import '../data/participantes_repository.dart';
import 'encerramento_dialog.dart';
import 'participantes_page.dart';

/// Recriar o bolão na temporada seguinte (CV-7).
///
/// O valor está em não recomeçar do zero: o admin não quer reconvidar 20 pessoas
/// nem reconfigurar a pontuação. O risco está em herdar o que **não** deve —
/// palpite ou ponto herdado corromperia a competição nova, e é o critério mais
/// importante da story. Por isso a tela diz, antes de confirmar, exatamente o
/// que vem e o que não vem.
class RecriarTemporadaDialog extends ConsumerStatefulWidget {
  const RecriarTemporadaDialog({
    required this.poolId,
    required this.nomeAtual,
    super.key,
  });

  final String poolId;
  final String nomeAtual;

  @override
  ConsumerState<RecriarTemporadaDialog> createState() =>
      _RecriarTemporadaDialogState();
}

class _RecriarTemporadaDialogState
    extends ConsumerState<RecriarTemporadaDialog> {
  final _de = TextEditingController(text: '1');
  final _ate = TextEditingController(text: '38');

  /// Nome do bolão anterior, sem sufixo. Anexar um ano cegamente produzia
  /// "Bolao 2026 2027" quando o nome já tinha ano — e o admin quase sempre quer
  /// escrever o nome dele, não corrigir um palpite do app.
  late final _nome = TextEditingController(text: widget.nomeAtual);

  Regras? _regras;
  int? _participantes;
  String? _erro;
  bool _carregando = true;
  bool _enviando = false;
  ({String nome, int herdados, int totalJogos})? _resultado;

  @override
  void initState() {
    super.initState();
    _carregarResumo();
  }

  @override
  void dispose() {
    _de.dispose();
    _ate.dispose();
    _nome.dispose();
    super.dispose();
  }

  /// Carrega o que vai ser herdado. Sem isso o admin confirma no escuro — e o
  /// que ele mais quer saber é "a galera vem junto?".
  Future<void> _carregarResumo() async {
    final repo = ref.read(participantesRepositoryProvider);
    try {
      final regras = await repo.regras(widget.poolId);
      final lista = await repo.listar(widget.poolId);
      if (!mounted) return;
      setState(() {
        _regras = regras;
        _participantes = lista.linhas.where((p) => p.ativo).length;
      });
    } on ApiError catch (e) {
      if (mounted) setState(() => _erro = e.mensagem);
    } finally {
      if (mounted) setState(() => _carregando = false);
    }
  }

  Future<void> _recriar() async {
    final de = int.tryParse(_de.text);
    final ate = int.tryParse(_ate.text);
    if (de == null || ate == null || de < 1 || ate > 38 || ate < de) {
      setState(
        () => _erro =
            'informe rodadas entre 1 e 38, com a final depois '
            'da inicial',
      );
      return;
    }

    setState(() {
      _enviando = true;
      _erro = null;
    });
    try {
      final r = await ref
          .read(cicloVidaRepositoryProvider)
          .recriar(
            widget.poolId,
            rodadaInicial: de,
            rodadaFinal: ate,
            nome: _nome.text.trim().isEmpty ? null : _nome.text.trim(),
          );
      if (!mounted) return;
      setState(
        () => _resultado = (
          nome: r.nome,
          herdados: r.herdados,
          totalJogos: r.totalJogos,
        ),
      );
    } on ApiError catch (e) {
      // "bolão ainda em andamento" é o motivo mais comum e é acionável.
      if (mounted) setState(() => _erro = e.mensagem);
    } finally {
      if (mounted) setState(() => _enviando = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    final r = _resultado;

    return AlertDialog(
      title: Text(r == null ? 'Recriar na próxima temporada' : 'Bolão criado'),
      content: SingleChildScrollView(
        child: r != null ? _sucesso(r) : _formulario(),
      ),
      actions: r != null
          ? [
              TextButton(
                onPressed: () => Navigator.of(context).pop(true),
                child: const Text('Fechar'),
              ),
            ]
          : [
              TextButton(
                onPressed: () => Navigator.of(context).pop(false),
                child: const Text('Cancelar'),
              ),
              FilledButton(
                onPressed: _enviando || _carregando ? null : _recriar,
                child: const Text('Criar temporada nova'),
              ),
            ],
    );
  }

  Widget _sucesso(({String nome, int herdados, int totalJogos}) r) => Column(
    mainAxisSize: MainAxisSize.min,
    crossAxisAlignment: CrossAxisAlignment.start,
    children: [
      Text('"${r.nome}" está criado.'),
      const SizedBox(height: 8),
      Text(
        '${r.herdados} participante(s) já estão dentro e '
        '${r.totalJogos} jogos foram carregados.',
      ),
      const SizedBox(height: 8),
      const Text(
        'A pontuação começa em zero e as regras podem ser ajustadas até o '
        'primeiro palpite.',
        style: TextStyle(fontSize: 12),
      ),
    ],
  );

  Widget _formulario() {
    final cores = Theme.of(context).colorScheme;
    final regras = _regras;

    return Column(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        if (_carregando)
          const Center(
            child: Padding(
              padding: EdgeInsets.all(16),
              child: CircularProgressIndicator(),
            ),
          )
        else ...[
          Text(
            'O que vem junto',
            style: Theme.of(context).textTheme.labelLarge,
          ),
          const SizedBox(height: 4),
          Text('· ${_participantes ?? '?'} participante(s), sem reconvidar'),
          if (regras != null)
            Text(
              '· a mesma pontuação: ${regras.pontosExato} / '
              '${regras.pontosVencedorSaldo} / ${regras.pontosVencedor}',
            ),
          const SizedBox(height: 12),
          Text('O que NÃO vem', style: Theme.of(context).textTheme.labelLarge),
          const SizedBox(height: 4),
          // O critério mais importante da story: herdar palpite ou ponto
          // corromperia a competição nova.
          const Text('· nenhum palpite e nenhum ponto — todos começam em zero'),
          const Text('· o título do bolão anterior fica no histórico'),
          const Divider(height: 24),
        ],
        TextField(
          controller: _nome,
          decoration: const InputDecoration(labelText: 'Nome do bolão novo'),
        ),
        const SizedBox(height: 12),
        Row(
          children: [
            Expanded(
              child: TextField(
                controller: _de,
                keyboardType: TextInputType.number,
                inputFormatters: [FilteringTextInputFormatter.digitsOnly],
                decoration: const InputDecoration(labelText: 'Da rodada'),
              ),
            ),
            const SizedBox(width: 12),
            Expanded(
              child: TextField(
                controller: _ate,
                keyboardType: TextInputType.number,
                inputFormatters: [FilteringTextInputFormatter.digitsOnly],
                decoration: const InputDecoration(labelText: 'Até a rodada'),
              ),
            ),
          ],
        ),
        if (_erro != null) ...[
          const SizedBox(height: 12),
          Text(_erro!, style: TextStyle(color: cores.error, fontSize: 12)),
        ],
      ],
    );
  }
}
