import 'package:flutter_custom_toolbox/flutter_toolbox.dart';

import 'package:snake/config/default_activity_settings.dart';

class ActivitySettings {
  String difficultyLevel;
  String parameterSize;

  ActivitySettings({
    required this.difficultyLevel,
    required this.parameterSize,
  });

  static String getLevelValueFromUnsafe(String level) {
    if (DefaultActivitySettings.allowedDifficultyLevelValues.contains(level)) {
      return level;
    }

    return DefaultActivitySettings.defaultDifficultyLevelValue;
  }

  static String getSizeValueFromUnsafe(String size) {
    if (DefaultActivitySettings.allowedBoardSizeValues.contains(size)) {
      return size;
    }

    return DefaultActivitySettings.defaultBoardSizeValue;
  }

  factory ActivitySettings.createDefault() {
    return ActivitySettings(
      difficultyLevel: DefaultActivitySettings.defaultDifficultyLevelValue,
      parameterSize: DefaultActivitySettings.defaultBoardSizeValue,
    );
  }

  int getBoardSizeFromParameter(String parameterSize) {
    const Map<String, int> values = {
      DefaultActivitySettings.boardSizeValueSmall: 12,
      DefaultActivitySettings.boardSizeValueMedium: 20,
      DefaultActivitySettings.boardSizeValueLarge: 30,
      DefaultActivitySettings.boardSizeValueExtra: 40,
    };
    return values[parameterSize] ??
        getBoardSizeFromParameter(DefaultActivitySettings.defaultBoardSizeValue);
  }

  int get boardSize => getBoardSizeFromParameter(parameterSize);

  void dump() {
    printlog('$ActivitySettings:');
    printlog('  ${DefaultActivitySettings.parameterCodeDifficultyLevel}: $difficultyLevel');
    printlog('  ${DefaultActivitySettings.parameterCodeBoardSize}: $parameterSize');
    printlog('');
  }

  @override
  String toString() {
    return '$ActivitySettings(${toJson()})';
  }

  Map<String, dynamic>? toJson() {
    return <String, dynamic>{
      DefaultActivitySettings.parameterCodeDifficultyLevel: difficultyLevel,
      DefaultActivitySettings.parameterCodeBoardSize: parameterSize,
    };
  }
}