import 'package:flutter/foundation.dart'; import '../modelos/emisora.dart'; import '../servicios/servicio_audio.dart'; import '../servicios/servicio_favoritos.dart'; import '../servicios/servicio_radio.dart'; import '../servicios/servicio_timer.dart'; /// Estado global de la app con ChangeNotifier (Provider). /// /// Centraliza: reproductoor, favoritos, búsqueda, timer. class EstadoRadio extends ChangeNotifier { final ServicioAudio audio = ServicioAudio(); final ServicioFavoritos favoritos = ServicioFavoritos(); final ServicioRadio radio = ServicioRadio(); late final ServicioTimer timer; List _populares = []; List _tendencias = []; List _resultadosBusqueda = []; List _listafavoritos = []; bool _cargandoPopulares = false; bool _cargandoBusqueda = false; String? _error; EstadoRadio() { timer = ServicioTimer(audio); _init(); } List get populares => _populares; List get tendencias => _tendencias; List get resultadosBusqueda => _resultadosBusqueda; List get listaFavoritos => _listafavoritos; bool get cargandoPopulares => _cargandoPopulares; bool get cargandoBusqueda => _cargandoBusqueda; String? get error => _error; Emisora? get emisoraActual => audio.emisoraActual; Stream get estadoStream => audio.estadoStream; Future _init() async { await Future.wait([ cargarPopulares(), cargarFavoritos(), ]); } Future cargarPopulares() async { _cargandoPopulares = true; _error = null; notifyListeners(); try { final results = await Future.wait([ radio.obtenerPopulares(limit: 30), radio.obtenerTendencias(limit: 20), ]); _populares = results[0]; _tendencias = results[1]; } catch (e) { _error = 'Error al cargar emisoras: $e'; } finally { _cargandoPopulares = false; notifyListeners(); } } Future cargarFavoritos() async { _listafavoritos = await favoritos.obtenerTodos(); notifyListeners(); } Future buscar({ String? nombre, String? pais, String? idioma, String? tag, }) async { _cargandoBusqueda = true; _resultadosBusqueda = []; notifyListeners(); try { _resultadosBusqueda = await radio.buscar( nombre: nombre, pais: pais, idioma: idioma, tag: tag, ); } catch (e) { _error = 'Error en búsqueda: $e'; } finally { _cargandoBusqueda = false; notifyListeners(); } } Future reproducir(Emisora emisora) async { try { await audio.reproducir(emisora); radio.registrarClick(emisora.uuid); // fire & forget notifyListeners(); } catch (e) { _error = 'No se puede reproducir esta emisora'; notifyListeners(); } } Future togglePlay() async { await audio.togglePlay(); notifyListeners(); } Future toggleFavorito(Emisora emisora) async { final esFav = await favoritos.toggleFavorito(emisora); await cargarFavoritos(); return esFav; } Future esFavorito(String uuid) => favoritos.esFavorito(uuid); void iniciarTimer(int minutos) { timer.iniciar(minutos); notifyListeners(); } void cancelarTimer() { timer.cancelar(); notifyListeners(); } @override void dispose() { audio.dispose(); timer.dispose(); super.dispose(); } }