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

import '../layout/game.dart';
import '../layout/parameters.dart';
import '../provider/data.dart';
import '../utils/game_utils.dart';

class Home extends StatefulWidget {
  static const String id = 'home';

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  void initState() {
    super.initState();

    Data myProvider = Provider.of<Data>(context, listen: false);
    myProvider.initParametersValues();
  }

  List getImagesAssets(Data myProvider) {
    List assets = [];

    List gameImages = [
      'button_back',
      'button_help',
      'button_show_conflicts',
      'button_start',
      'game_win',
    ];
    myProvider.availableDifficultyLevels.forEach(
      (difficulty) => gameImages.add('difficulty_' + difficulty)
    );
    myProvider.availableSizes.forEach(
      (size) => gameImages.add('size_' + size)
    );

    gameImages.forEach(
      (image) => assets.add('assets/icons/' + image + '.png')
    );

    List skinImages = [];
    for (int value = 1; value <= 16; value++) {
      skinImages.add(value.toString());
    }

    myProvider.availableSkins.forEach(
      (skin) => skinImages.forEach(
        (image) => assets.add('assets/skins/' + skin + '_' + image + '.png')
      )
    );

    assets.add('assets/skins/empty.png');

    return assets;
  }

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

    if (!myProvider.assetsPreloaded) {
      List assets = getImagesAssets(myProvider);
      assets.forEach(
        (asset) => precacheImage(AssetImage(asset), context)
      );
      myProvider.updateAssetsPreloaded(true);
    }

    List<Widget> menuActions = [];

    if (myProvider.gameIsRunning) {
      menuActions = [
        FlatButton(
          child: Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(4),
              border: Border.all(
                color: Colors.blue,
                width: 4,
              ),
            ),
            margin: EdgeInsets.all(8),
            child: Image(
              image: AssetImage('assets/icons/button_back.png'),
              fit: BoxFit.fill
            ),
          ),
          onPressed: () => toast('Long press to quit game...'),
          onLongPress: () => GameUtils.resetGame(myProvider),
        ),
        Spacer(flex: 6),
        FlatButton(
          child: Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(4),
              border: Border.all(
                color: Colors.blue,
                width: 4,
              ),
            ),
            margin: EdgeInsets.all(8),
            child: Badge(
              showBadge: myProvider.givenTipsCount == 0 ? false : true,
              badgeColor:
                myProvider.givenTipsCount < 10
                  ? Colors.green
                  : myProvider.givenTipsCount < 20
                    ? Colors.orange
                    : Colors.red,
              badgeContent: Text(
                myProvider.givenTipsCount == 0 ? '' : myProvider.givenTipsCount.toString(),
                style: TextStyle(
                  color: Colors.white
                )
              ),
              child: Image(
                image: AssetImage('assets/icons/button_help.png'),
                fit: BoxFit.fill
              ),
            )
          ),
          onPressed: () => GameUtils.showTip(myProvider),
        ),
        Spacer(),
        FlatButton(
          child: Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(4),
              border: Border.all(
                color: myProvider.showConflicts ? Colors.white : Colors.blue,
                width: 4,
              ),
            ),
            margin: EdgeInsets.all(8),
            child: Image(
              image: AssetImage('assets/icons/button_show_conflicts.png'),
              fit: BoxFit.fill
            ),
          ),
          onPressed: () {
            myProvider.toggleShowConflicts();
          },
        ),
      ];
    }

    return Scaffold(
      appBar: AppBar(
        actions: menuActions,
      ),
      body: SafeArea(
        child: Center(
          child: myProvider.gameIsRunning
            ? Game.buildGameWidget(myProvider)
            : Parameters.buildParametersSelector(myProvider)
        ),
      )
    );
  }
}