import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../provider/data.dart';
import '../utils/random_pick_data.dart';

class GamePickImagePage extends StatelessWidget {
  int _countWords = 4;
  int _countImages = 1;

  Future<void> startGame(Data myProvider, String lang) async {
    await resetGame(myProvider);
    myProvider.updateLang = lang;
    await nextWord(myProvider);
  }

  Future<void> resetGame(Data myProvider) async {
    myProvider.updateLang = '';
    myProvider.updateQuestionsCount = 0;
    myProvider.updateGoodAnswers = 0;
    myProvider.updateWrongAnswers = 0;
    myProvider.updateWord = null;
    myProvider.updateImages = null;
  }

  Future<void> nextWord(Data myProvider) async {
    await pickData(myProvider);
    myProvider.updateQuestionsCount = myProvider.questionsCount + 1;
  }

  Future<void> pickData(Data myProvider) async {
    List words;
    RandomPickData randomPickData;
    Map word;

    int attempts = 0;
    do {
      randomPickData = RandomPickData();
      await randomPickData.init(myProvider.lang, _countWords, _countImages);

      if (randomPickData.words != null) {
        words = randomPickData.words;
        word = words.take(1).toList()[0];
      }
      attempts++;
    } while (attempts < 3);

    if ((words != null) && (words.length == _countWords)) {
      myProvider.updateWord = word;
      myProvider.updateImages = words;
    }
  }

  Future<void> checkWord(Data myProvider, word) async {
    if (myProvider.word['key'] == word['key']) {
      myProvider.updateGoodAnswers = myProvider.goodAnswers + 1;
      nextWord(myProvider);
    } else {
      myProvider.updateWrongAnswers = myProvider.wrongAnswers + 1;
    }
  }

  Container _buildScoreItemContainer(String text, Color blockColor) {
    Color backgroundColor = blockColor;

    // Darken block color to get border color
    double amount = 0.2;
    final hsl = HSLColor.fromColor(blockColor);
    final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));
    Color borderColor = hslDark.toColor();

    return Container(
      margin: EdgeInsets.symmetric(horizontal: 15),
      padding: EdgeInsets.all(5),
      decoration: BoxDecoration(
        color: backgroundColor,
        borderRadius: BorderRadius.circular(4),
        border: Border.all(
          color: borderColor,
          width: 4,
        ),
      ),
      child: Text(
        text,
        style: TextStyle(
          fontSize: 25,
          fontWeight: FontWeight.w600,
          color: Colors.black,
        ),
      ),
    );
  }

  Container _buildScoreContainer(Data myProvider) {
    return Container(
      padding: EdgeInsets.all(5),
      child: Row(
        mainAxisSize: MainAxisSize.min,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          _buildScoreItemContainer(
            '❓ ' + myProvider.questionsCount.toString(),
            Colors.white,
          ),
          SizedBox(width: 20),
          _buildScoreItemContainer(
            '☺️ ' + myProvider.goodAnswers.toString(),
            Colors.green,
          ),
          SizedBox(width: 20),
          _buildScoreItemContainer(
            '😟 ' + myProvider.wrongAnswers.toString(),
            Colors.orange,
          ),
        ],
      ),
    );
  }

  Container _buildImageContainer(Data myProvider, Map word) {
    double imageSize = 130;

    String imageAsset = 'assets/placeholder.png';
    if ((word['images'] != null) && (word['images'][0] != null)) {
        imageAsset = 'assets/images/'+word['images'][0];
    }

    return Container(
      child: FlatButton(
        child: Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(8),
            border: Border.all(
              color: Colors.blue[200],
              width: 8,
            ),
          ),
          margin: EdgeInsets.all(2),
          child: Image(
            image: AssetImage(imageAsset),
            width: imageSize,
            height: imageSize,
            fit: BoxFit.fill
          ),
        ),
        onPressed: () { checkWord(myProvider, word); },
      ),
    );
  }

  Column _buildImageItemsBlock(Data myProvider) {
    List words = myProvider.images;

    if ((words == null) || (words.length != _countWords)) {
      return Column();
    }

    words.sort((a, b) => a['key'].compareTo(b['key']));

    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _buildImageContainer(myProvider, words[0]),
            _buildImageContainer(myProvider, words[1]),
          ],
        ),
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            _buildImageContainer(myProvider, words[2]),
            _buildImageContainer(myProvider, words[3]),
          ],
        )
      ],
    );
  }

  Column _buildTextItemBlock(Data myProvider) {
    Map word = myProvider.word;

    if (word == null) {
      return Column();
    }

    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Container(
          margin: EdgeInsets.all(2),
          decoration: BoxDecoration(
            color: Colors.blue,
            borderRadius: BorderRadius.circular(6),
            border: Border.all(
              color: Colors.white,
              width: 6,
            ),
          ),
          child: RaisedButton(
            padding: EdgeInsets.all(15),
            child: Text(
              word != null ? word[myProvider.lang] : '',
              style: TextStyle(
                fontSize: 30,
                fontWeight: FontWeight.w600,
                color: Colors.white,
              ),
            ),
          ),
        ),
      ],
    );
  }

  Column _buildStartGameBlock(Data myProvider) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Container(
          child: RaisedButton(
            color: Colors.teal,
            padding: EdgeInsets.all(35),
            child: Text(
              "πŸ‡«πŸ‡·",
              style: TextStyle(
                fontSize: 60,
                color: Colors.black,
              ),
            ),
            onPressed: () => startGame(myProvider, 'fr'),
          ),
        ),
        SizedBox(height: 15),
        Container(
          child: RaisedButton(
            color: Colors.teal,
            padding: EdgeInsets.all(35),
            child: Text(
              "πŸ‡¬πŸ‡§",
              style: TextStyle(
                fontSize: 60,
                color: Colors.black,
              ),
            ),
            onPressed: () => startGame(myProvider, 'en'),
          ),
        )
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    Data _myProvider = Provider.of<Data>(context);

    Scaffold pageContent = Scaffold(
      appBar: AppBar(
        elevation: 0,
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.loop),
            onPressed: () => resetGame(_myProvider),
          ),
        ],
      ),
      backgroundColor: Colors.blue,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            _buildTextItemBlock(_myProvider),
            SizedBox(height: 2),
            ((_myProvider.word == null) || (_myProvider.word['key'] == '')) ?
            _buildStartGameBlock(_myProvider) :
            _buildScoreContainer(_myProvider),
            SizedBox(height: 2),
            _buildImageItemsBlock(_myProvider),
          ],
        ),
      ),
    );

    return SizedBox.expand(
      child: Container(
        child: FittedBox(
          fit: BoxFit.contain,
          alignment: Alignment.center,
          child: SizedBox(
            height: (MediaQuery.of(context).size.height),
            width: (MediaQuery.of(context).size.width),
            child: pageContent,
          )
        )
      )
    );
  }
}