import 'dart:async';
import 'dart:convert';
import "dart:math";

import 'package:flutter/services.dart';

class RandomPickWord {
  static Set<String> wordList = <String>{};
  static Set<String> dictionary = <String>{};

  static String _lang = '';
  static int _length = 5;
  static String _level = '';

  RandomPickWord();

  String _word = '';
  String get word => _word;

  init(String lang, int length, String level) async {
    if (lang != _lang || length != _length || level != _level || wordList.isEmpty || dictionary.isEmpty) {
      _lang = lang;
      _length = length;
      _level = level;

      dictionary.clear();
      wordList.clear();

      String wordBaseFilename = 'words-' + length.toString() + '-' + lang;

      // Get full dictionary (eligible words)
      print('Reload dictionary / ' + lang + ' / ' + length.toString());
      try {
        String wordsFile = wordBaseFilename + '-' + 'dictionary';
        var data = await rootBundle.loadString('assets/files/' + wordsFile + '.txt');
        LineSplitter.split(data).forEach((line) {
          if (line.length == length) {
            dictionary.add(line.toUpperCase());
          }
        });
      } catch (e) {
        throw "Failed loading dictionary database";
      }

      // Get guessable words list (will pick random word from)
      print('Reload words list  / ' + lang + ' / ' + length.toString() + ' / ' + level);
      try {
        String wordsFile = wordBaseFilename + '-' + level;
        var data = await rootBundle.loadString('assets/files/' + wordsFile + '.txt');
        LineSplitter.split(data).forEach((line) {
          if (line.length == length) {
            wordList.add(line.toUpperCase());
          }
        });
      } catch (e) {
        throw "Failed loading words database";
      }
    }

    print('Words in dictionary: ' + dictionary.length.toString());
    print('Words in words list: ' + wordList.length.toString());

    _word = '';
    await wordFromLocalFile();
  }

  Future<void> wordFromLocalFile() async {
    // Check we have enough words
    if (wordList.length < 1) {
      print('Not enough words in list.');
      _word = '';
    } else {
      final _random = new Random();
      _word = wordList.elementAt(_random.nextInt(wordList.length));
    }

    print('Picked word: ' + _word);
  }

  static bool checkWordExists(String word) {
    return dictionary.contains(word);
  }
}