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

import 'package:sortgame/config/default_game_settings.dart';
import 'package:sortgame/config/default_global_settings.dart';
import 'package:sortgame/cubit/settings_game_cubit.dart';
import 'package:sortgame/cubit/settings_global_cubit.dart';
import 'package:sortgame/ui/parameters/parameter_image.dart';
import 'package:sortgame/ui/parameters/parameter_painter.dart';
import 'package:sortgame/ui/widgets/actions/button_delete_saved_game.dart';
import 'package:sortgame/ui/widgets/actions/button_game_start_new.dart';
import 'package:sortgame/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(SizedBox(height: separatorHeight));

    if (!canResume) {
      // Start new game
      lines.add(const Expanded(
        child: StartNewGameButton(),
      ));
    } else {
      // Resume game
      lines.add(const Expanded(
        child: ResumeSavedGameButton(),
      ));
      // Delete saved game
      lines.add(SizedBox.square(
        dimension: MediaQuery.of(context).size.width / 4,
        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 isActive = (value == currentValue);

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

              final bool displayedWithAssets =
                  DefaultGlobalSettings.displayedWithAssets.contains(code) ||
                      DefaultGameSettings.displayedWithAssets.contains(code);

              return TextButton(
                child: Container(
                  child: displayedWithAssets
                      ? SizedBox.square(
                          dimension: itemWidth,
                          child: ParameterImage(
                            code: code,
                            value: value,
                            isSelected: isActive,
                          ),
                        )
                      : CustomPaint(
                          size: Size(itemWidth, itemWidth),
                          willChange: false,
                          painter: ParameterPainter(
                            code: code,
                            value: value,
                            isSelected: isActive,
                            gameSettings: gameSettingsState.settings,
                            globalSettings: globalSettingsState.settings,
                          ),
                          isComplex: true,
                        ),
                ),
                onPressed: () => isGlobal
                    ? globalSettingsCubit.setParameterValue(code, value)
                    : gameSettingsCubit.setParameterValue(code, value),
              );
            },
          );
        },
      );

      parameterButtons.add(parameterButton);
    }

    return parameterButtons;
  }
}