import 'package:flutter/material.dart';

import 'package:wordguessing/data/fetch_data_helper.dart';
import 'package:wordguessing/models/word.dart';
import 'package:wordguessing/provider/data.dart';
import 'package:wordguessing/ui/games/abstract_game.dart';

class GamePickWordPage extends GameAbstract {
  const GamePickWordPage({super.key});

  @override
  void pickData(Data myProvider) {
    Word word;

    int attempts = 0;
    do {
      final List<Word> words = FetchDataHelper().getWords(myProvider.lang, countWords);

      word = words.take(1).toList()[0];

      if ((words.length >= countWords) && !myProvider.isRecentlyPicked(word.key)) {
        myProvider.updateWord(word);
        myProvider.updateOtherWords(words.skip(1).toList());
        myProvider.updateImages([word]);
      }

      attempts++;
    } while (myProvider.word != word && attempts < 10);
  }

  Widget buildImageContainer(String image) {
    const double imageSize = 130;

    String imageAsset = 'assets/placeholder.png';
    if (image != '') {
      imageAsset = 'assets/images/$image';
    }

    return Container(
      margin: const EdgeInsets.all(2),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(8),
        border: Border.all(
          color: Colors.blue.shade200,
          width: 8,
        ),
      ),
      child: Image(
        image: AssetImage(imageAsset),
        width: imageSize,
        height: imageSize,
        fit: BoxFit.fill,
      ),
    );
  }

  Widget buildImageItemsBlock(Word? currentWord) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildImageContainer(currentWord?.images[0] ?? ''),
            buildImageContainer(currentWord?.images[1] ?? ''),
          ],
        ),
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildImageContainer(currentWord?.images[2] ?? ''),
            buildImageContainer(currentWord?.images[3] ?? ''),
          ],
        )
      ],
    );
  }

  Widget buildTextContainer(Data myProvider, Word word) {
    return Container(
      margin: const EdgeInsets.all(2),
      decoration: BoxDecoration(
        color: Colors.blue[800],
        borderRadius: BorderRadius.circular(6),
        border: Border.all(
          color: Colors.white,
          width: 6,
        ),
      ),
      child: TextButton(
        style: TextButton.styleFrom(
          padding: const EdgeInsets.all(15),
        ),
        child: Text(
          word.text,
          style: const TextStyle(
            fontSize: 20,
            fontWeight: FontWeight.w600,
            color: Colors.white,
          ),
        ),
        onPressed: () {
          checkWord(myProvider, word);
        },
      ),
    );
  }

  Widget buildTextItemsBlock(Data myProvider) {
    Word? word = myProvider.word;
    List<Word> otherWords = myProvider.otherWords;

    if ((word == null) || (otherWords.length != (countWords - 1))) {
      return const Column();
    }

    List<Word> words = [
      word,
      otherWords[0],
      otherWords[1],
      otherWords[2],
    ];

    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: [
            buildTextContainer(myProvider, words[0]),
            const SizedBox(width: 10),
            buildTextContainer(myProvider, words[1]),
          ],
        ),
        const SizedBox(height: 5),
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildTextContainer(myProvider, words[2]),
            const SizedBox(width: 10),
            buildTextContainer(myProvider, words[3]),
          ],
        )
      ],
    );
  }

  @override
  List<Widget> buildPageContent(Data myProvider) {
    return <Widget>[
      (myProvider.images.isNotEmpty)
          ? buildImageItemsBlock(myProvider.images[0])
          : const SizedBox.shrink(),
      const SizedBox(height: 2),
      ((myProvider.word == null) || (myProvider.word?.key == ''))
          ? buildStartGameBlock(myProvider)
          : buildScoreContainer(myProvider),
      const SizedBox(height: 2),
      buildTextItemsBlock(myProvider),
    ];
  }
}