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

import '../../../core/api/api_client.dart';
import 'rodada_page.dart';

/// Correção manual de placar pelo admin (PR-10).
///
/// Existe porque a fonte gratuita atrasa e às vezes erra, e o bolão não pode
/// ficar com pontuação errada esperando a fonte se resolver. O preço é alto:
/// o admin pode alterar a pontuação de todos, então a tela **avisa** que a
/// alteração fica registrada e visível a todos, e que a fonte oficial prevalece
/// quando chegar depois.
class CorrigirPlacarDialog extends ConsumerStatefulWidget {
  const CorrigirPlacarDialog({
    required this.poolId,
    required this.matchId,
    required this.timeCasa,
    required this.timeFora,
    this.oficialCasa,
    this.oficialFora,
    super.key,
  });

  final String poolId;
  final String matchId;
  final String timeCasa;
  final String timeFora;
  final int? oficialCasa;
  final int? oficialFora;

  @override
  ConsumerState<CorrigirPlacarDialog> createState() =>
      _CorrigirPlacarDialogState();
}

class _CorrigirPlacarDialogState extends ConsumerState<CorrigirPlacarDialog> {
  late final TextEditingController _casa = TextEditingController(
    text: widget.oficialCasa?.toString() ?? '',
  );
  late final TextEditingController _fora = TextEditingController(
    text: widget.oficialFora?.toString() ?? '',
  );

  String? _erro;
  bool _enviando = false;
  ({int afetados, int avisos})? _resultado;

  @override
  void dispose() {
    _casa.dispose();
    _fora.dispose();
    super.dispose();
  }

  Future<void> _corrigir() async {
    final casa = int.tryParse(_casa.text);
    final fora = int.tryParse(_fora.text);
    if (casa == null || fora == null || casa < 0 || fora < 0) {
      setState(() => _erro = 'informe os dois placares, de 0 a 20');
      return;
    }
    if (casa > 20 || fora > 20) {
      setState(() => _erro = 'placar máximo é 20 — confira antes de aplicar');
      return;
    }
    if (!await _confirmar(casa, fora)) return;

    setState(() {
      _enviando = true;
      _erro = null;
    });
    try {
      final r = await ref
          .read(boloesRepositoryProvider)
          .corrigirPlacar(widget.poolId, widget.matchId, casa, fora);
      if (!mounted) return;
      setState(() => _resultado = r);
    } on ApiError catch (e) {
      // "jogo ainda não terminou", "apenas o administrador": cada motivo tem
      // texto próprio e é o que ensina o admin a agir.
      if (mounted) setState(() => _erro = e.mensagem);
    } finally {
      if (mounted) setState(() => _enviando = false);
    }
  }

  Future<bool> _confirmar(int casa, int fora) async {
    final ok = await showDialog<bool>(
      context: context,
      builder: (context) => AlertDialog(
        title: const Text('Aplicar a correção?'),
        content: Text(
          'A pontuação de todos os participantes será recalculada com '
          '$casa x $fora, e quem for afetado recebe aviso.\n\n'
          'A alteração fica registrada com seu nome e visível a todos. Se a '
          'fonte oficial enviar outro placar depois, ela prevalece.',
        ),
        actions: [
          TextButton(
            onPressed: () => Navigator.of(context).pop(false),
            child: const Text('Cancelar'),
          ),
          FilledButton(
            onPressed: () => Navigator.of(context).pop(true),
            child: const Text('Aplicar'),
          ),
        ],
      ),
    );
    return ok == true;
  }

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

    return AlertDialog(
      title: Text('${widget.timeCasa} x ${widget.timeFora}'),
      content: Column(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          if (r != null) ...[
            Text(
              r.afetados == 0
                  ? 'Nenhum palpite foi afetado — a pontuação não mudou.'
                  : '${r.afetados} palpite(s) reapurado(s), '
                        '${r.avisos} participante(s) avisado(s).',
            ),
            const SizedBox(height: 8),
            const Text(
              'A alteração aparece no extrato de todos, com o placar anterior.',
              style: TextStyle(fontSize: 12),
            ),
          ] else ...[
            const Text('Placar oficial correto:'),
            const SizedBox(height: 12),
            Row(
              children: [
                _Campo(controle: _casa, rotulo: widget.timeCasa),
                const Padding(
                  padding: EdgeInsets.symmetric(horizontal: 12),
                  child: Text('x'),
                ),
                _Campo(controle: _fora, rotulo: widget.timeFora),
              ],
            ),
            const SizedBox(height: 12),
            const Text(
              'Use isto quando a fonte oficial estiver errada ou atrasada. Fica '
              'registrado com seu nome, visível a todos os participantes.',
              style: TextStyle(fontSize: 12),
            ),
          ],
          if (_erro != null) ...[
            const SizedBox(height: 12),
            Text(
              _erro!,
              style: TextStyle(
                color: Theme.of(context).colorScheme.error,
                fontSize: 12,
              ),
            ),
          ],
        ],
      ),
      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 ? null : _corrigir,
                child: const Text('Corrigir placar'),
              ),
            ],
    );
  }
}

class _Campo extends StatelessWidget {
  const _Campo({required this.controle, required this.rotulo});

  final TextEditingController controle;
  final String rotulo;

  @override
  Widget build(BuildContext context) => SizedBox(
    width: 64,
    child: Semantics(
      label: 'Gols de $rotulo',
      child: TextField(
        controller: controle,
        textAlign: TextAlign.center,
        keyboardType: TextInputType.number,
        inputFormatters: [
          FilteringTextInputFormatter.digitsOnly,
          LengthLimitingTextInputFormatter(2),
        ],
        decoration: const InputDecoration(isDense: true),
      ),
    ),
  );
}
