import 'package:flutter/material.dart';

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

class Board {

  static Container buildGameBoard(Data myProvider) {
    Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black;

    return Container(
      margin: EdgeInsets.all(2),
      padding: EdgeInsets.all(2),
      decoration: BoxDecoration(
        color: borderColor,
        borderRadius: BorderRadius.circular(2),
        border: Border.all(
          color: borderColor,
          width: 2,
        ),
      ),
      child: Column(
        children: [
          buildGameTileset(myProvider),
          buildMinesCounterWidget(myProvider),
        ],
      ),
    );
  }

  static Table buildGameTileset(Data myProvider) {
    List cells = myProvider.cells;

    return Table(
      defaultColumnWidth: IntrinsicColumnWidth(),
      children: [
        for (var row = 0; row < myProvider.sizeVertical; row++)
          TableRow(children: [
            for (var col = 0; col < myProvider.sizeHorizontal; col++)
              Column(children: [
                cells[row][col].widget(
                  myProvider,
                  row,
                  col
                )
              ]),
          ]),
      ]
    );
  }

  static FlatButton buildToggleFlagModeButton(Data myProvider) {
    String reportModeSuffix = myProvider.reportMode ? 'on' : 'off';

    return FlatButton(
      child: Container(
        child: Image(
          image: AssetImage('assets/skins/' + myProvider.skin  + '_button_mark_mine_' + reportModeSuffix + '.png'),
          fit: BoxFit.fill,
        ),
      ),
      onPressed: () => myProvider.updateReportMode(!myProvider.reportMode),
    );
  }

  static Table buildToggleFlagModeLayout(Data myProvider) {
    Image paddingBlock = Image(
      image: AssetImage('assets/skins/empty.png'),
      fit: BoxFit.fill,
    );

    return Table(
      defaultColumnWidth: IntrinsicColumnWidth(),
      children: [
        TableRow(
          children: [
            TableCell(child: paddingBlock),
            TableCell(child: paddingBlock),
            TableCell(child: buildToggleFlagModeButton(myProvider)),
            TableCell(child: paddingBlock),
            TableCell(child: paddingBlock),
          ],
        ),
      ],
    );
  }

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

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

    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,
          ],
        )
      ]);
  }

}