import 'dart:async';
import 'package:flutter/material.dart';
import 'package:farolero/l10n/generated/app_localizations.dart';
import 'package:farolero/modelos/inicio_partida_multijugador.dart';
import 'package:farolero/modelos/jugador.dart';
import 'package:farolero/pantallas/pantalla_notas_online.dart';
import 'package:farolero/pantallas/pantalla_revision_palabra.dart';
import 'package:farolero/pantallas/pantalla_votacion_cliente.dart';
import 'package:farolero/servicios/servicio_nearby.dart';
import 'package:farolero/tema/componentes_farolero.dart';
import 'package:farolero/tema/tema_app.dart';
import 'package:provider/provider.dart';

class PantallaDebateCliente extends StatefulWidget {
  final int? tiempoDebateSegundos;
  final String? primerTurnoNombre;
  final String? partidaId;
  final String? pistaCategoria;
  final List<Jugador> jugadores;
  final List<JugadorInicioPartida> jugadoresControlados;
  final VoidCallback onSolicitarVotacion;

  const PantallaDebateCliente({
    super.key,
    this.tiempoDebateSegundos,
    this.primerTurnoNombre,
    this.partidaId,
    this.pistaCategoria,
    this.jugadores = const [],
    this.jugadoresControlados = const [],
    required this.onSolicitarVotacion,
  });

  @override
  State<PantallaDebateCliente> createState() => _PantallaDebateClienteState();
}

class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
  Timer? _timer;
  int _segundosRestantes = 0;
  bool _votacionSolicitada = false;
  OnMensajeCallback? _listener;
  ServicioNearby? _nearby;

  @override
  void initState() {
    super.initState();
    _listener = (endpointId, mensaje) {
      if (!mounted || mensaje.tipo != TipoMensaje.fase) return;
      final fase = mensaje.datos['fase'] as String?;
      if (fase == 'votacion') {
        Navigator.of(context).pushReplacement(
          MaterialPageRoute(
            builder: (_) => PantallaVotacionCliente(
              jugadores: widget.jugadores,
              jugadoresControlados: widget.jugadoresControlados,
              partidaId: widget.partidaId,
              pistaCategoria: widget.pistaCategoria,
              onVotos: _enviarVotos,
            ),
          ),
        );
      }
    };
    WidgetsBinding.instance.addPostFrameCallback((_) {
      final listener = _listener;
      if (listener != null && mounted) {
        _nearby = context.read<ServicioNearby>();
        _nearby!.onMensaje(listener);
      }
    });
    if (widget.tiempoDebateSegundos != null) {
      _segundosRestantes = widget.tiempoDebateSegundos!;
      _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
        if (_segundosRestantes > 0) {
          setState(() => _segundosRestantes--);
        } else {
          timer.cancel();
        }
      });
    }
  }

  @override
  void dispose() {
    _timer?.cancel();
    final listener = _listener;
    if (listener != null) _nearby?.removeMensajeListener(listener);
    super.dispose();
  }

  void _enviarVotos(Map<String, String> votos) {
    final nearby = context.read<ServicioNearby>();
    if (nearby.hostEndpointId == null) return;
    for (final entry in votos.entries) {
      nearby.enviarMensaje(
        nearby.hostEndpointId!,
        MensajeP2P(
          tipo: TipoMensaje.voto,
          datos: {
            'votanteId': entry.key,
            'votadoId': entry.value,
            'votoporId': entry.value,
          },
        ),
      );
    }
  }

  String _formatearTiempo(int segundos) {
    final min = segundos ~/ 60;
    final seg = segundos % 60;
    return "${min.toString().padLeft(2, '0')}:${seg.toString().padLeft(2, '0')}";
  }

  @override
  Widget build(BuildContext context) {
    final l10n = AppLocalizations.of(context)!;

    return Scaffold(
      backgroundColor: TemaApp.colorFondo,
      appBar: AppBar(
        title: Text(l10n.debate),
        automaticallyImplyLeading: false,
        backgroundColor: Colors.transparent,
        elevation: 0,
        actions: [
          IconButton(
            tooltip: l10n.seeYourWord,
            icon: IconoFarolero(Icons.visibility),
            onPressed: widget.jugadoresControlados.isEmpty
                ? null
                : () => mostrarRevisionPalabraOnline(
                      context: context,
                      jugadoresControlados: widget.jugadoresControlados,
                      pistaCategoria: widget.pistaCategoria,
                    ),
          ),
          IconButton(
            tooltip: l10n.notesTitle,
            icon: IconoFarolero(Icons.edit_note),
            onPressed: _puedeAbrirNotas
                ? () => Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (_) => PantallaNotasOnline(
                          partidaId: widget.partidaId!,
                          jugadores: widget.jugadores,
                          autoresControlados: widget.jugadoresControlados,
                        ),
                      ),
                    )
                : null,
          ),
        ],
      ),
      body: FondoFarolero(
        intenso: true,
        child: SafeArea(
          top: false,
          child: SingleChildScrollView(
            padding: const EdgeInsets.all(24),
            child: Column(
              children: [
                const ArteGameplayFarolero.fase(height: 124),
                const SizedBox(height: 12),
                TarjetaFaseFarolero(
                  icono: Icons.forum,
                  assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
                  titulo: l10n.debate,
                  subtitulo: l10n.debateInstructions,
                  child: Column(
                    children: [
                      if (widget.tiempoDebateSegundos != null) ...[
                        TemporizadorFarolero(
                          etiqueta: _segundosRestantes == 0
                              ? l10n.timeUp
                              : l10n.timeRemaining,
                          tiempo: _formatearTiempo(_segundosRestantes),
                          agotado: _segundosRestantes == 0,
                        ),
                        const SizedBox(height: 16),
                      ] else ...[
                        Text(
                          l10n.debatePhaseActive,
                          style: Theme.of(context).textTheme.titleLarge,
                          textAlign: TextAlign.center,
                        ),
                        const SizedBox(height: 16),
                      ],
                      if (widget.primerTurnoNombre != null) ...[
                        EstadoJugadorFarolero(
                          nombre: l10n.firstTurnInstruction(
                            widget.primerTurnoNombre!,
                          ),
                          destacado: true,
                          completado: true,
                          icono: Icons.record_voice_over,
                          assetIconPath: 'assets/ui/generated/actions/action_players_group.webp',
                        ),
                        const SizedBox(height: 12),
                      ],
                      BotonFarolero.secundario(
                        texto: _votacionSolicitada
                            ? l10n.votacionSolicitada
                            : l10n.solicitarVotacion,
                        icono: _votacionSolicitada
                            ? Icons.hourglass_empty
                            : Icons.how_to_vote,
                        assetIconPath: _votacionSolicitada
                            ? null
                            : 'assets/ui/generated/actions/action_vote_mask.webp',
                        onPressed: _votacionSolicitada
                            ? null
                            : () {
                                setState(() => _votacionSolicitada = true);
                                widget.onSolicitarVotacion();
                              },
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  bool get _puedeAbrirNotas {
    return widget.partidaId != null &&
        widget.jugadores.isNotEmpty &&
        widget.jugadoresControlados.isNotEmpty;
  }
}
