import 'package:cabo_counter/data/game_session.dart';
import 'package:cabo_counter/services/local_storage_service.dart';
import 'package:flutter/foundation.dart';

class GameManager extends ChangeNotifier {
  List<GameSession> gameList = [];

  /// Adds a new game session to the list and sorts it by creation date.
  /// Takes a [GameSession] object as input. It then adds the session to the `gameList`,
  /// sorts the list in descending order based on the creation date, and notifies listeners of the change.
  /// It also saves the updated game sessions to local storage.
  /// Returns the index of the newly added session in the sorted list.
  Future<int> addGameSession(GameSession session) async {
    session.addListener(() {
      notifyListeners(); // Propagate session changes
    });
    gameList.add(session);
    gameList.sort((a, b) => b.createdAt.compareTo(a.createdAt));
    notifyListeners();
    await LocalStorageService.saveGameSessions();
    return gameList.indexOf(session);
  }

  /// Removes a game session from the list and sorts it by creation date.
  /// Takes a [index] as input. It then removes the session at the specified index from the `gameList`,
  /// sorts the list in descending order based on the creation date, and notifies listeners of the change.
  /// It also saves the updated game sessions to local storage.
  void removeGameSessionByIndex(int index) {
    gameList[index].removeListener(notifyListeners);
    gameList.removeAt(index);
    notifyListeners();
    LocalStorageService.saveGameSessions();
  }

  /// Removes a game session by its ID.
  /// Takes a String [id] as input. It finds the index of the game session with the matching ID
  /// in the `gameList`, and then calls `removeGameSessionByIndex` with that index.
  void removeGameSessionById(String id) {
    final int index =
        gameList.indexWhere((session) => session.id.toString() == id);
    if (index == -1) return;
    removeGameSessionByIndex(index);
  }

  /// Retrieves a game session by its ID.
  /// Takes a String [id] as input. It finds the game session with the matching id
  bool gameExistsInGameList(String id) {
    return gameList.any((session) => session.id.toString() == id);
  }

  /// Ends a game session if its in unlimited mode.
  /// Takes a String [id] as input. It finds the index of the game
  /// session with the matching ID marks it as finished,
  void endGame(String id) {
    final int index =
        gameList.indexWhere((session) => session.id.toString() == id);

    // Game session not found or not in unlimited mode
    if (index == -1 || gameList[index].isPointsLimitEnabled == true) return;

    gameList[index].roundNumber--;
    gameList[index].isGameFinished = true;
    notifyListeners();
    LocalStorageService.saveGameSessions();
  }
}

final gameManager = GameManager();
