import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'package:tetrisdual/cubit/game_cubit.dart';
import 'package:tetrisdual/models/game/counter.dart';

class CounterWidget extends StatelessWidget {
  const CounterWidget({super.key, required this.counter});

  final Counter counter;

  static const double iconSize = 30.0;
  static const double fontSize = 50.0;
  static const double spacerHeight = 7;

  // Counter categories icons
  static const Color categoryIconColor = Colors.green;
  static const Icon iconTouchingColor = Icon(
    Icons.join_full,
    color: categoryIconColor,
    size: iconSize,
  );
  static const Icon iconRowsCount = Icon(
    Icons.table_rows,
    color: categoryIconColor,
    size: iconSize,
  );
  static const Icon iconHolesCount = Icon(
    Icons.check_box_outline_blank,
    color: categoryIconColor,
    size: iconSize,
  );

  // Action buttons icons
  static const Color buttonIconColor = Colors.blue;
  static const Icon iconRemove = Icon(
    Icons.remove,
    color: buttonIconColor,
    size: iconSize,
  );
  static const Icon iconAdd = Icon(
    Icons.add,
    color: buttonIconColor,
    size: iconSize,
  );

  @override
  Widget build(BuildContext context) {
    final GameCubit gameCubit = BlocProvider.of<GameCubit>(context);

    const spacer = TableRow(children: [
      SizedBox(height: spacerHeight),
      SizedBox(height: spacerHeight),
      SizedBox(height: spacerHeight),
      SizedBox(height: spacerHeight),
    ]);

    return Table(
      children: [
        buildTouchWidget(gameCubit),
        spacer,
        buildLinesWidget(gameCubit),
        spacer,
        buildHolesWidget(gameCubit),
        spacer,
      ],
    );
  }

  TableRow buildTouchWidget(GameCubit gameCubit) {
    return TableRow(
      children: [
        iconTouchingColor,
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconRemove,
          onPressed: () {
            counter.touch = false;
            gameCubit.refresh();
          },
        ),
        Center(
          child: Icon(
            counter.touch ? Icons.radio_button_checked : Icons.radio_button_unchecked,
            color: categoryIconColor,
            size: iconSize,
          ),
        ),
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconAdd,
          onPressed: () {
            counter.touch = true;
            gameCubit.refresh();
          },
        ),
      ],
    );
  }

  TableRow buildLinesWidget(GameCubit gameCubit) {
    return TableRow(
      children: [
        iconRowsCount,
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconRemove,
          onPressed: () {
            counter.lines = max(counter.lines - 1, 0);
            gameCubit.refresh();
          },
        ),
        Center(
          child: Text(
            counter.lines.toString(),
            style: const TextStyle(
              fontFamily: 'Blocks',
              fontSize: fontSize,
            ),
            textHeightBehavior: const TextHeightBehavior(
              applyHeightToFirstAscent: false,
              applyHeightToLastDescent: false,
            ),
          ),
        ),
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconAdd,
          onPressed: () {
            counter.lines = min(counter.lines + 1, 4);
            gameCubit.refresh();
          },
        ),
      ],
    );
  }

  TableRow buildHolesWidget(GameCubit gameCubit) {
    return TableRow(
      children: [
        iconHolesCount,
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconRemove,
          onPressed: () {
            counter.holes = max(counter.holes - 1, 0);
            gameCubit.refresh();
          },
        ),
        Center(
          child: Text(
            counter.holes.toString(),
            style: const TextStyle(
              fontFamily: 'Blocks',
              fontSize: fontSize,
            ),
            textHeightBehavior: const TextHeightBehavior(
              applyHeightToFirstAscent: false,
              applyHeightToLastDescent: false,
            ),
          ),
        ),
        IconButton(
          padding: EdgeInsets.zero,
          constraints: const BoxConstraints(),
          style: const ButtonStyle(
            tapTargetSize: MaterialTapTargetSize.shrinkWrap,
          ),
          icon: iconAdd,
          onPressed: () {
            counter.holes = min(counter.holes + 1, 9);
            gameCubit.refresh();
          },
        ),
      ],
    );
  }
}