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

class Data extends ChangeNotifier {

  // Configuration available values
  List _availableLangValues = ['fr'];
  List _availableWordLengthValues = ['5'];
  List _availableSkinValues = ['default'];

  List get availableLangValues => _availableLangValues;
  List get availableWordLengthValues => _availableWordLengthValues;
  List get availableSkinValues => _availableSkinValues;

  // Application default configuration
  String _lang = '';
  String _langDefault = 'fr';
  String _length = '';
  String _lengthDefault = '5';
  String _skin = '';
  String _skinDefault = 'default';

  // Game data
  bool _gameIsRunning = false;
  String _word = '';
  final int _recentWordsCount = 20;
  List _recentWords = [];
  List<String> _guesses = [];
  String _currentGuess = '';
  int _maxGuessesCount = 7;

  String get lang => _lang;
  void updateLang(String lang) {
    _lang = lang;
    notifyListeners();
  }

  String get length => _length;
  void updateLength(String length) {
    _length = length;
    notifyListeners();
  }

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

  List<String> get guesses => _guesses;
  String get currentGuess => _currentGuess;
  int get maxGuessesCount => _maxGuessesCount;
  void currentGuessAddLetter(String letter) {
    if (_currentGuess.length < int.parse(_length)) {
      _currentGuess = _currentGuess + letter;
      notifyListeners();
    }
  }
  void currentGuessRemoveLetter() {
    if (_currentGuess.length > 0) {
      _currentGuess = _currentGuess.substring(0, _currentGuess.length - 1);
      notifyListeners();
    }
  }
  void currentGuessSubmitWord() {
    if (_currentGuess.length == int.parse(_length)) {
      print('check word: '+_currentGuess);
      if (_currentGuess != _word) {
        print('wrong');
      } else {
        print('ok found');
      }
      addGuess(_currentGuess);
      notifyListeners();
    }
  }
  void addGuess(String word) {
    print('addGuess('+word+')');
    _guesses.add(word);
    _currentGuess = '';
  }

  getParameterValue(String parameterCode) {
    switch(parameterCode) {
      case 'lang': { return _lang; }
      break;
      case 'length': { return _length; }
      break;
      case 'skin': { return _skin; }
      break;
    }
  }

  List getParameterAvailableValues(String parameterCode) {
    switch(parameterCode) {
      case 'lang': { return _availableLangValues; }
      break;
      case 'length': { return _availableWordLengthValues; }
      break;
      case 'skin': { return _availableSkinValues; }
      break;
    }
    return [];
  }

  setParameterValue(String parameterCode, String parameterValue) async {
    switch(parameterCode) {
      case 'lang': { updateLang(parameterValue); }
      break;
      case 'length': { updateLength(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('lang', prefs.getString('lang') ?? _langDefault);
    setParameterValue('length', prefs.getString('length') ?? _lengthDefault);
    setParameterValue('skin', prefs.getString('skin') ?? _skinDefault);
  }

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

  String get word => _word;

  void updateWord(String word) {
    _word = word;
    if (word != null) {
      _recentWords.insert(0, word);
      _recentWords = _recentWords.take(_recentWordsCount).toList();
    }
    notifyListeners();
  }

  bool isRecentlyPicked(String word) {
    return _recentWords.contains(word);
  }

  void resetGame() {
    _word = '';
    _guesses = [];
    _currentGuess = '';
    notifyListeners();
  }

}