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

import '../../../core/api/api_client.dart';
import '../../auth/presentation/sessao_controller.dart';
import '../data/boloes_repository.dart';
import 'prazo.dart';
import 'rodada_page.dart';

/// Palpites de todos num jogo (PP-7).
///
/// O sigilo vale até o jogo **terminar**, não até o apito inicial: durante a
/// partida o palpite alheio ainda é informação de valor. E vale para todo
/// papel, admin incluído — é o que torna justa a participação de quem organiza.
///
/// A tela **não** guarda nada em cache: cache de palpite de terceiro em jogo
/// não terminado é o mesmo vazamento por outro caminho.
class PalpitesDoJogoPage extends ConsumerStatefulWidget {
  const PalpitesDoJogoPage({
    required this.poolId,
    required this.matchId,
    required this.timeCasa,
    required this.timeFora,
    required this.kickoffAt,
    super.key,
  });

  final String poolId;
  final String matchId;
  final String timeCasa;
  final String timeFora;
  final DateTime kickoffAt;

  @override
  ConsumerState<PalpitesDoJogoPage> createState() => _PalpitesDoJogoPageState();
}

class _PalpitesDoJogoPageState extends ConsumerState<PalpitesDoJogoPage> {
  PalpitesDoJogo? _resposta;
  String? _erro;
  bool _carregando = true;

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

  Future<void> _carregar() async {
    setState(() => _erro = null);
    try {
      final r = await ref
          .read(boloesRepositoryProvider)
          .palpitesDoJogo(widget.poolId, widget.matchId);
      if (!mounted) return;
      setState(() => _resposta = r);
    } on ApiError catch (e) {
      if (mounted) setState(() => _erro = e.mensagem);
    } finally {
      if (mounted) setState(() => _carregando = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('${widget.timeCasa} x ${widget.timeFora}')),
      body: RefreshIndicator(onRefresh: _carregar, child: _corpo()),
    );
  }

  Widget _corpo() {
    if (_carregando) return const Center(child: CircularProgressIndicator());

    if (_resposta == null) {
      return _centro(
        icone: Icons.cloud_off,
        titulo: 'Não foi possível carregar',
        detalhe: _erro ?? 'falha ao carregar',
        acao: FilledButton(
          onPressed: _carregar,
          child: const Text('Tentar de novo'),
        ),
      );
    }

    if (!_resposta!.revelado) {
      // Estado explícito, não lista vazia: "ainda em segredo" é informação, e
      // lista vazia pareceria bolão sem palpite nenhum.
      return _centro(
        icone: Icons.visibility_off_outlined,
        titulo: 'Ainda em segredo',
        detalhe:
            'Os palpites de todos aparecem quando este jogo terminar — '
            'nem o organizador vê antes. Início: '
            '${formatarHorarioLocal(widget.kickoffAt)}.',
      );
    }

    final palpites = _resposta!.palpites;
    if (palpites.isEmpty) {
      return _centro(
        icone: Icons.person_off_outlined,
        titulo: 'Ninguém palpitou neste jogo',
        detalhe: 'O jogo terminou e nenhum participante tinha palpite.',
      );
    }

    final sessao = ref.watch(sessaoProvider);
    final meuId = sessao is Autenticado ? sessao.conta.id : null;

    return ListView.separated(
      itemCount: palpites.length,
      separatorBuilder: (_, _) => const Divider(height: 1),
      itemBuilder: (_, i) {
        final p = palpites[i];
        final souEu = p.userId == meuId;
        return ListTile(
          title: Text(
            p.displayName + (souEu ? ' (você)' : ''),
            style: TextStyle(fontWeight: souEu ? FontWeight.bold : null),
          ),
          leading: Text(
            '${p.casa}x${p.fora}',
            style: Theme.of(context).textTheme.titleMedium,
          ),
          trailing: Text(
            p.pontos == null ? '—' : '${p.pontos} pts',
            style: Theme.of(context).textTheme.titleMedium,
          ),
        );
      },
    );
  }

  Widget _centro({
    required IconData icone,
    required String titulo,
    required String detalhe,
    Widget? acao,
  }) => Center(
    child: Padding(
      padding: const EdgeInsets.all(32),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          Icon(icone, size: 48),
          const SizedBox(height: 12),
          Text(titulo, style: Theme.of(context).textTheme.titleMedium),
          const SizedBox(height: 6),
          Text(detalhe, textAlign: TextAlign.center),
          if (acao != null) ...[const SizedBox(height: 16), acao],
        ],
      ),
    ),
  );
}
