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 GamePickImagePage extends GameAbstract {
  const GamePickImagePage({super.key});

  @override
  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);

        final List<Word> images = [];
        for (var element in words) {
          images.add(element);
        }

        myProvider.updateImages(images);
      }

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

  Widget buildImageContainer(Data myProvider, Word word) {
    const double imageSize = 130;

    String imageAsset = 'assets/placeholder.png';
    if ((word.images.isNotEmpty)) {
      imageAsset = 'assets/images/${word.images[0]}';
    }

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

  Widget buildImageItemsBlock(Data myProvider) {
    final List<Word> images = myProvider.images;

    if (images.length != countWords) {
      return const SizedBox.shrink();
    }

    images.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, images[0]),
            buildImageContainer(myProvider, images[1]),
          ],
        ),
        Row(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            buildImageContainer(myProvider, images[2]),
            buildImageContainer(myProvider, images[3]),
          ],
        )
      ],
    );
  }

  Widget buildTextItemBlock(Data myProvider) {
    final Word? word = myProvider.word;

    if (word == null) {
      return const SizedBox.shrink();
    }

    return Container(
      decoration: BoxDecoration(
        color: Colors.blue.shade800,
        borderRadius: BorderRadius.circular(6),
        border: Border.all(
          color: Colors.white,
          width: 6,
        ),
      ),
      child: Padding(
        padding: const EdgeInsets.all(12),
        child: Text(
          word.text,
          style: const TextStyle(
            fontSize: 30,
            fontWeight: FontWeight.w600,
            color: Colors.white,
          ),
        ),
      ),
    );
  }

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