import 'package:flutter/material.dart';

import '../layout/board.dart';
import '../provider/data.dart';
import '../utils/board_utils.dart';
import '../utils/game_utils.dart';

class Game {

  static Container buildGameWidget(Data myProvider) {
    bool gameIsFinished = myProvider.gameWin || myProvider.gameFail;

    return Container(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          SizedBox(height: 8),
          Game.buildTopIndicatorWidget(myProvider),
          SizedBox(height: 2),
          Expanded(
            child: Board.buildGameBoard(myProvider),
          ),
          SizedBox(height: 2),
          Container(
            child: gameIsFinished
              ? Game.buildEndGameMessage(myProvider)
              : Board.buildToggleFlagModeLayout(myProvider),
          ),
          SizedBox(height: 8),
        ],
      ),
    );
  }

  static Widget buildTopIndicatorWidget(Data myProvider) {
    int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.cells);
    int minesCount = myProvider.minesCount;
    double blockSize = 40;

    Image flagIconBlock = Image(
      image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_flag.png'),
      fit: BoxFit.fill,
      height: blockSize,
      width: blockSize,
    );
    Image mineIconBlock = Image(
      image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'),
      fit: BoxFit.fill,
      height: blockSize,
      width: blockSize,
    );
    Text markedMinesCountBlock = Text(
      flaggedCellsCount.toString(),
      style: TextStyle(
        fontSize: blockSize,
        fontWeight: FontWeight.bold,
        color: Colors.black
      ),
    );
    Text placedMinesCountBlock = Text(
      minesCount.toString(),
      style: TextStyle(
        fontSize: blockSize,
        fontWeight: FontWeight.bold,
        color: Colors.black
      ),
    );

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            markedMinesCountBlock,
            flagIconBlock,
            SizedBox(width: blockSize * 2),
            mineIconBlock,
            placedMinesCountBlock,
          ],
        )
      ]);
  }

  static FlatButton buildRestartGameButton(Data myProvider) {
    return FlatButton(
      child: Container(
        child: Image(
          image: AssetImage('assets/icons/button_back.png'),
          fit: BoxFit.fill,
        ),
      ),
      onPressed: () => GameUtils.resetGame(myProvider),
    );
  }

  static Container buildEndGameMessage(Data myProvider) {
    Image decorationImage = Image(
      image: AssetImage(
        myProvider.gameWin
          ? 'assets/icons/game_win.png'
          : myProvider.gameFail
            ? 'assets/icons/game_fail.png'
            : ''
      ),
      fit: BoxFit.fill
    );

    return Container(
      margin: EdgeInsets.all(2),
      padding: EdgeInsets.all(2),

      child: Table(
        defaultColumnWidth: IntrinsicColumnWidth(),
        children: [
          TableRow(
            children: [
              Column(children: [ decorationImage ]),
              Column(children: [ myProvider.animationInProgress ? decorationImage : buildRestartGameButton(myProvider) ]),
              Column(children: [ decorationImage ]),
            ],
          ),
        ]
      )
    );
  }

}