import 'dart:math';

import 'package:momomotus/data/game_data.dart';
import 'package:momomotus/utils/tools.dart';

class FetchDataHelper {
  FetchDataHelper();

  Map<String, Map<String, Map<String, List<String>>>> _words = {};
  Map<String, Map<String, Map<String, List<String>>>> get words => _words;

  void init() {
    try {
      // Map<LANG, Map<LENGTH, Map<TYPE, List<WORD>>>> data = {};
      Map<String, Map<String, Map<String, List<String>>>> data = {};

      final Map<String, dynamic> dataPerLang = GameData.data['words'] as Map<String, dynamic>;

      dataPerLang.forEach((lang, rawDataPerLength) {
        Map<String, Map<String, List<String>>> dataForThisLang = {};

        final Map<String, dynamic> dataPerLength = rawDataPerLength as Map<String, dynamic>;
        dataPerLength.forEach((length, rawDataPerType) {
          Map<String, List<String>> dataForTheseLangAndLength = {};

          final Map<String, dynamic> dataPerType = rawDataPerType as Map<String, dynamic>;
          dataPerType.keys.toList().forEach((String type) {
            List<String> wordsList = [];

            final List<dynamic> rawWordsList = dataPerType[type] as List<dynamic>;
            for (var item in rawWordsList) {
              wordsList.add(item.toString());
            }

            dataForTheseLangAndLength[type] = wordsList;
          });

          dataForThisLang[length] = dataForTheseLangAndLength;
        });
        data[lang] = dataForThisLang;
      });

      _words = data;
    } catch (e) {
      printlog("$e");
    }
  }

  List<String> getDictionary({
    required String lang,
    required String length,
  }) {
    if (_words.isEmpty) {
      init();
    }

    final List<String> dictionary = _words[lang]?[length]?['dictionary'] ?? [];
    if (dictionary.isEmpty) {
      printlog('Did not find any word for dictionary $lang/$length.');
    }

    return dictionary;
  }

  String getRandomWord({
    required String lang,
    required String length,
    required String level,
  }) {
    if (_words.isEmpty) {
      init();
    }

    final List<String> list = _words[lang]?[length]?[level] ?? [];
    if (list.isEmpty) {
      printlog('Did not find any word for list $lang/$length/$level.');
    }

    return list.elementAt(Random().nextInt(list.length - 1));
  }
}