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

import 'package:jeweled/config/default_game_settings.dart';
import 'package:jeweled/models/settings/settings_game.dart';

part 'settings_game_state.dart';

class GameSettingsCubit extends HydratedCubit<GameSettingsState> {
  GameSettingsCubit() : super(GameSettingsState(settings: GameSettings.createDefault()));

  void setValues({
    String? boardSize,
    String? colorsCount,
  }) {
    emit(
      GameSettingsState(
        settings: GameSettings(
          boardSize: boardSize ?? state.settings.boardSize,
          colorsCount: colorsCount ?? state.settings.colorsCount,
        ),
      ),
    );
  }

  String getParameterValue(String code) {
    switch (code) {
      case DefaultGameSettings.parameterCodeBoardSize:
        return GameSettings.getBoardSizeValueFromUnsafe(state.settings.boardSize);
      case DefaultGameSettings.parameterCodeColorsCount:
        return GameSettings.getColorsCountValueFromUnsafe(state.settings.colorsCount);
    }

    return '';
  }

  void setParameterValue(String code, String value) {
    final String boardSize = code == DefaultGameSettings.parameterCodeBoardSize
        ? value
        : getParameterValue(DefaultGameSettings.parameterCodeBoardSize);
    final String colorsCount = code == DefaultGameSettings.parameterCodeColorsCount
        ? value
        : getParameterValue(DefaultGameSettings.parameterCodeColorsCount);

    setValues(
      boardSize: boardSize,
      colorsCount: colorsCount,
    );
  }

  @override
  GameSettingsState? fromJson(Map<String, dynamic> json) {
    final String boardSize = json[DefaultGameSettings.parameterCodeBoardSize] as String;
    final String colorsCount = json[DefaultGameSettings.parameterCodeColorsCount] as String;

    return GameSettingsState(
      settings: GameSettings(
        boardSize: boardSize,
        colorsCount: colorsCount,
      ),
    );
  }

  @override
  Map<String, dynamic>? toJson(GameSettingsState state) {
    return <String, dynamic>{
      DefaultGameSettings.parameterCodeBoardSize: state.settings.boardSize,
      DefaultGameSettings.parameterCodeColorsCount: state.settings.colorsCount,
    };
  }
}