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

import 'package:snake/common/cubit/nav/nav_cubit_pages.dart';

import 'package:snake/cubit/activity/activity_cubit.dart';
import 'package:snake/ui/parameters/parameter_painter_board_size.dart';
import 'package:snake/ui/parameters/parameter_painter_difficulty_level.dart';

class ApplicationConfig {
  static const String parameterCodeSkin = 'global.skin';
  static const String parameterCodeDifficultyLevel = 'difficultyLevel';
  static const String parameterCodeBoardSize = 'boardSize';

  static const String skinValueColors = 'colors';

  static const String difficultyLevelValueEasy = 'easy';
  static const String difficultyLevelValueMedium = 'medium';
  static const String difficultyLevelValueHard = 'hard';
  static const String difficultyLevelValueNightmare = 'nightmare';

  static const String boardSizeValueSmall = 'small';
  static const String boardSizeValueMedium = 'medium';
  static const String boardSizeValueLarge = 'large';
  static const String boardSizeValueExtraLarge = 'extra';

  static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
    appTitle: 'Snake',
    activitySettings: [
      // skin
      ApplicationSettingsParameter(
        code: parameterCodeSkin,
        values: [
          ApplicationSettingsParameterItemValue(
            value: skinValueColors,
            isDefault: true,
          ),
        ],
      ),

      // difficulty level
      ApplicationSettingsParameter(
        code: parameterCodeDifficultyLevel,
        values: [
          ApplicationSettingsParameterItemValue(
            value: difficultyLevelValueEasy,
            color: Colors.green,
          ),
          ApplicationSettingsParameterItemValue(
            value: difficultyLevelValueMedium,
            color: Colors.orange,
            isDefault: true,
          ),
          ApplicationSettingsParameterItemValue(
            value: difficultyLevelValueHard,
            color: Colors.red,
          ),
          ApplicationSettingsParameterItemValue(
            value: difficultyLevelValueNightmare,
            color: Colors.purple,
          ),
        ],
        customPainter: (context, value) => ParameterPainterDifficultyLevel(
          context: context,
          value: value,
        ),
      ),

      // board size
      ApplicationSettingsParameter(
        code: parameterCodeBoardSize,
        values: [
          ApplicationSettingsParameterItemValue(
            value: boardSizeValueSmall,
            color: Colors.green,
          ),
          ApplicationSettingsParameterItemValue(
            value: boardSizeValueMedium,
            color: Colors.orange,
            isDefault: true,
          ),
          ApplicationSettingsParameterItemValue(
            value: boardSizeValueLarge,
            color: Colors.red,
          ),
          ApplicationSettingsParameterItemValue(
            value: boardSizeValueExtraLarge,
            color: Colors.purple,
          ),
        ],
        customPainter: (context, value) => ParameterPainterBoardSize(
          context: context,
          value: value,
        ),
        intValueGetter: (String value) {
          const Map<String, int> intValues = {
            boardSizeValueSmall: 6,
            boardSizeValueMedium: 10,
            boardSizeValueLarge: 14,
            boardSizeValueExtraLarge: 20,
          };
          return intValues[value] ?? 1;
        },
      ),
    ],
    startNewActivity: (BuildContext context) {
      BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
      BlocProvider.of<NavCubitPage>(context).goToPageGame();
    },
    deleteCurrentActivity: (BuildContext context) {
      BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
    },
    resumeActivity: (BuildContext context) {
      BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
      BlocProvider.of<NavCubitPage>(context).goToPageGame();
    },
  );
}