import 'package:flutter/material.dart';
import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:calculus/config/default_game_settings.dart';
import 'package:calculus/config/default_global_settings.dart';
import 'package:calculus/cubit/settings_game_cubit.dart';
import 'package:calculus/cubit/settings_global_cubit.dart';
import 'package:calculus/ui/parameters/parameter_widget.dart';
import 'package:calculus/ui/widgets/actions/button_delete_saved_game.dart';
import 'package:calculus/ui/widgets/actions/button_game_start_new.dart';
import 'package:calculus/ui/widgets/actions/button_resume_saved_game.dart';

class ParametersLayout extends StatelessWidget {
  const ParametersLayout({super.key, required this.canResume});

  final bool canResume;

  final double separatorHeight = 8.0;

  @override
  Widget build(BuildContext context) {
    final List<Widget> lines = [];

    // Game settings
    for (String code in DefaultGameSettings.availableParameters) {
      lines.add(Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: buildParametersLine(
          code: code,
          isGlobal: false,
        ),
      ));

      lines.add(SizedBox(height: separatorHeight));
    }

    lines.add(Expanded(
      child: SizedBox(height: separatorHeight),
    ));

    if (canResume == false) {
      // Start new game
      lines.add(
        const AspectRatio(
          aspectRatio: 3,
          child: StartNewGameButton(),
        ),
      );
    } else {
      // Resume game
      lines.add(const AspectRatio(
        aspectRatio: 3,
        child: ResumeSavedGameButton(),
      ));
      // Delete saved game
      lines.add(SizedBox.square(
        dimension: MediaQuery.of(context).size.width / 5,
        child: const DeleteSavedGameButton(),
      ));
    }

    lines.add(SizedBox(height: separatorHeight));

    // Global settings
    for (String code in DefaultGlobalSettings.availableParameters) {
      lines.add(Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: buildParametersLine(
          code: code,
          isGlobal: true,
        ),
      ));

      lines.add(SizedBox(height: separatorHeight));
    }

    return Column(
      children: lines,
    );
  }

  List<Widget> buildParametersLine({
    required String code,
    required bool isGlobal,
  }) {
    final List<Widget> parameterButtons = [];

    final List<String> availableValues = isGlobal
        ? DefaultGlobalSettings.getAvailableValues(code)
        : DefaultGameSettings.getAvailableValues(code);

    if (availableValues.length <= 1) {
      return [];
    }

    for (String value in availableValues) {
      final Widget parameterButton = BlocBuilder<GameSettingsCubit, GameSettingsState>(
        builder: (BuildContext context, GameSettingsState gameSettingsState) {
          return BlocBuilder<GlobalSettingsCubit, GlobalSettingsState>(
            builder: (BuildContext context, GlobalSettingsState globalSettingsState) {
              final GameSettingsCubit gameSettingsCubit =
                  BlocProvider.of<GameSettingsCubit>(context);
              final GlobalSettingsCubit globalSettingsCubit =
                  BlocProvider.of<GlobalSettingsCubit>(context);

              final String currentValue = isGlobal
                  ? globalSettingsCubit.getParameterValue(code)
                  : gameSettingsCubit.getParameterValue(code);

              final bool isSelected = (value == currentValue);

              final double displayWidth = MediaQuery.of(context).size.width;
              final double itemWidth = displayWidth / availableValues.length - 4;

              return SizedBox.square(
                dimension: itemWidth,
                child: ParameterWidget(
                  code: code,
                  value: value,
                  isSelected: isSelected,
                  size: itemWidth,
                  gameSettings: gameSettingsState.settings,
                  globalSettings: globalSettingsState.settings,
                  onPressed: () {
                    isGlobal
                        ? globalSettingsCubit.setParameterValue(code, value)
                        : gameSettingsCubit.setParameterValue(code, value);
                  },
                ),
              );
            },
          );
        },
      );

      parameterButtons.add(parameterButton);
    }

    return parameterButtons;
  }
}