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

class Data extends ChangeNotifier {

  // Configuration available values
  List _availableLevelValues = ['easy', 'normal', 'hard', 'nightmare'];
  List _availableSkinValues = ['colors', 'retro'];

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

  // Application default configuration
  String _level = '';
  String _levelDefault = 'normal';
  String _skin = '';
  String _skinDefault = 'colors';

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

  String get level => _level;
  void updateLevel(String level) {
    _level = level;
    notifyListeners();
  }

  String get skin => _skin;
  void updateSkin(String skin) {
    _skin = skin;
    notifyListeners();
  }

  getParameterValue(String parameterCode) {
    switch(parameterCode) {
      case 'level': { return _level; }
      break;
      case 'skin': { return _skin; }
      break;
    }
  }

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

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

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

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

  bool isGameFinished() {
    return false;
  }

  bool get gameWon => _gameWon;

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

}