import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Data extends ChangeNotifier {
  // Configuration available values
  final List<String> _availableLevelValues = ['easy', 'medium', 'hard'];
  final List<String> _availableSkinValues = ['default', 'images'];

  List<String> get availableLevelValues => _availableLevelValues;
  List<String> get availableSkinValues => _availableSkinValues;

  // Application default configuration
  String _parameterLevel = '';
  final String _parameterLevelDefault = 'medium';
  String _parameterSkin = '';
  final String _parameterSkinDefault = 'default';

  // Application current configuration
  String get parameterLevel => _parameterLevel;
  String get parameterSkin => _parameterSkin;

  // Game data
  bool _gameIsRunning = false;
  bool _gameWon = false;

  void updateParameterLevel(String parameterLevel) {
    _parameterLevel = parameterLevel;
    notifyListeners();
  }

  void updateParameterSkin(String parameterSkin) {
    _parameterSkin = parameterSkin;
    notifyListeners();
  }

  String getParameterValue(String parameterCode) {
    switch (parameterCode) {
      case 'level':
        {
          return _parameterLevel;
        }
      case 'skin':
        {
          return _parameterSkin;
        }
    }
    return '';
  }

  List getParameterAvailableValues(String parameterCode) {
    switch (parameterCode) {
      case 'level':
        {
          return _availableLevelValues;
        }
      case 'skin':
        {
          return _availableSkinValues;
        }
    }
    return [];
  }

  setParameterValue(String parameterCode, String parameterValue) async {
    switch (parameterCode) {
      case 'level':
        {
          updateParameterLevel(parameterValue);
        }
        break;
      case 'skin':
        {
          updateParameterSkin(parameterValue);
        }
        break;
    }
    final prefs = await SharedPreferences.getInstance();
    prefs.setString(parameterCode, parameterValue);
  }

  void initParametersValues() async {
    final prefs = await SharedPreferences.getInstance();
    setParameterValue('level', prefs.getString('level') ?? _parameterLevelDefault);
    setParameterValue('skin', prefs.getString('skin') ?? _parameterSkinDefault);
  }

  bool get gameIsRunning => _gameIsRunning;
  void updateGameIsRunning(bool gameIsRunning) {
    _gameIsRunning = gameIsRunning;
    notifyListeners();
  }

  bool isGameFinished() {
    return _gameWon;
  }

  bool get gameWon => _gameWon;
  void updateGameWon(bool gameWon) {
    _gameWon = gameWon;
    notifyListeners();
  }

  void resetGame() {
    _gameIsRunning = false;
    _gameWon = false;
    notifyListeners();
  }
}