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

import 'avisos_page.dart';
import 'boas_vindas.dart';
import 'convite_dialog.dart';
import 'encerramento_dialog.dart';
import 'participantes_page.dart';
import 'ranking_page.dart';
import 'regras_page.dart';
import 'rodada_page.dart';

/// Tela do bolão: palpite, ranking, extrato e participantes numa navegação só.
class BolaoPage extends ConsumerStatefulWidget {
  const BolaoPage({
    required this.poolId,
    required this.nome,
    required this.matchday,
    this.souAdmin = false,
    this.encerrado = false,
    this.rodadaFinal,
    this.mostrarBoasVindas = false,
    this.arquivado = false,
    super.key,
  });

  final String poolId;
  final String nome;
  final int matchday;

  /// Convite é ação de admin. Mostrar o botão a todos levava o participante
  /// comum a um 403 — e a autorização é do servidor, a UI só não deve mentir
  /// sobre o que ele pode fazer.
  final bool souAdmin;

  /// Última rodada do bolão. Sem isso o ranking só alterna entre o geral e a
  /// rodada de abertura, e quem quer ver a rodada 7 não tem como.
  final int? rodadaFinal;

  /// Arquivado. Some das ações de admin e muda o texto: "encerrado" e
  /// "arquivado" são estados diferentes, e chamar um pelo nome do outro faz o
  /// admin procurar um encerramento que não houve.
  final bool arquivado;

  /// Acabou de entrar pelo convite: mostra a regra e o próximo prazo de uma vez
  /// (CC-5 FE-4). Quem entra sem saber a regra palpita achando que placar exato
  /// vale o mesmo que acertar o vencedor.
  final bool mostrarBoasVindas;

  /// Bolão encerrado não aceita palpite nem entrada. Precisa estar dito na
  /// tela: campo desabilitado sem motivo é indistinguível de app quebrado.
  final bool encerrado;

  @override
  ConsumerState<BolaoPage> createState() => _BolaoPageState();
}

class _BolaoPageState extends ConsumerState<BolaoPage> {
  int _aba = 0;

  @override
  void initState() {
    super.initState();
    if (widget.mostrarBoasVindas) {
      // Depois do primeiro frame: `showModalBottomSheet` precisa do contexto já
      // montado, e abrir durante o build quebra.
      WidgetsBinding.instance.addPostFrameCallback((_) => _boasVindas());
    }
  }

  Future<void> _boasVindas() async {
    if (!mounted) return;
    await showModalBottomSheet<void>(
      context: context,
      showDragHandle: true,
      builder: (_) => BoasVindasAoBolao(poolId: widget.poolId),
    );
  }

  /// Abre o convite. Não gera nada por conta própria: gerar revoga o anterior,
  /// e abrir a tela para conferir não pode invalidar o link já compartilhado.
  Future<void> _abrirConvite() => showDialog<void>(
    context: context,
    builder: (_) => ConviteDialog(poolId: widget.poolId),
  );

  void _abrir(Widget tela) {
    Navigator.of(context).push(MaterialPageRoute<void>(builder: (_) => tela));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.nome),
        actions: [
          // Bolão encerrado não aceita mais ninguém: o convite não teria uso.
          if (widget.souAdmin && !widget.encerrado)
            IconButton(
              tooltip: 'Convidar',
              icon: const Icon(Icons.person_add_alt),
              onPressed: _abrirConvite,
            ),
          PopupMenuButton<String>(
            // Regras e avisos são consulta, não navegação principal — mas
            // precisam estar a um toque de qualquer aba.
            onSelected: (v) => switch (v) {
              'regras' => _abrir(
                RegrasPage(poolId: widget.poolId, souAdmin: widget.souAdmin),
              ),
              'encerrar' => showDialog<void>(
                context: context,
                builder: (_) => EncerramentoDialog(poolId: widget.poolId),
              ),
              // Bolão já encerrado: mesma tela, só leitura. O campeão precisa
              // continuar alcançável — e por **todo** participante, não só por
              // quem encerrou (critério de CV-1).
              'resultado' => showDialog<void>(
                context: context,
                builder: (_) => EncerramentoDialog(
                  poolId: widget.poolId,
                  jaEncerrado: true,
                ),
              ),
              _ => _abrir(
                AvisosPage(poolId: widget.poolId, matchday: widget.matchday),
              ),
            },
            itemBuilder: (_) => [
              const PopupMenuItem(
                value: 'regras',
                child: Text('Regras do bolão'),
              ),
              const PopupMenuItem(value: 'avisos', child: Text('Avisos')),
              // Encerrar é ação de admin: o servidor recusa os outros com 403.
              // Bolão já encerrado não tem o que encerrar.
              if (widget.souAdmin && !widget.encerrado)
                const PopupMenuItem(
                  value: 'encerrar',
                  child: Text('Encerrar o bolão'),
                ),
              if (widget.encerrado)
                const PopupMenuItem(
                  value: 'resultado',
                  child: Text('Campeão e classificação final'),
                ),
            ],
          ),
        ],
      ),
      body: switch (_aba) {
        0 => RodadaPage(
          poolId: widget.poolId,
          matchday: widget.matchday,
          encerrado: widget.encerrado,
          arquivado: widget.arquivado,
          // Arquivado não recebe correção de placar: é histórico fechado.
          souAdmin: widget.souAdmin && !widget.arquivado,
        ),
        1 => RankingPage(
          poolId: widget.poolId,
          matchday: widget.matchday,
          rodadaFinal: widget.rodadaFinal,
        ),
        2 => ExtratoPage(poolId: widget.poolId, matchday: widget.matchday),
        _ => ParticipantesPage(
          poolId: widget.poolId,
          matchday: widget.matchday,
          souAdmin: widget.souAdmin,
        ),
      },
      bottomNavigationBar: NavigationBar(
        selectedIndex: _aba,
        onDestinationSelected: (i) => setState(() => _aba = i),
        destinations: const [
          NavigationDestination(
            icon: Icon(Icons.edit_outlined),
            label: 'Palpites',
          ),
          NavigationDestination(
            icon: Icon(Icons.leaderboard_outlined),
            label: 'Ranking',
          ),
          NavigationDestination(
            icon: Icon(Icons.receipt_long_outlined),
            label: 'Extrato',
          ),
          NavigationDestination(
            icon: Icon(Icons.groups_outlined),
            label: 'Gente',
          ),
        ],
      ),
    );
  }
}
