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

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

part 'settings_game_state.dart';

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

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

  String getParameterValue(String code) {
    switch (code) {
      case DefaultGameSettings.parameterCodeItemsCount:
        return GameSettings.getItemsCountValueFromUnsafe(state.settings.itemsCount);
      case DefaultGameSettings.parameterCodeThemeCode:
        return GameSettings.getThemeValueFromUnsafe(state.settings.themeCode);
    }

    return '';
  }

  void setParameterValue(String code, String value) {
    final String itemsCount = code == DefaultGameSettings.parameterCodeItemsCount
        ? value
        : getParameterValue(DefaultGameSettings.parameterCodeItemsCount);
    final String themeCode = code == DefaultGameSettings.parameterCodeThemeCode
        ? value
        : getParameterValue(DefaultGameSettings.parameterCodeThemeCode);

    setValues(
      itemsCount: itemsCount,
      themeCode: themeCode,
    );
  }

  @override
  GameSettingsState? fromJson(Map<String, dynamic> json) {
    final String itemsCount = json[DefaultGameSettings.parameterCodeItemsCount] as String;
    final String themeCode = json[DefaultGameSettings.parameterCodeThemeCode] as String;

    return GameSettingsState(
      settings: GameSettings(
        itemsCount: itemsCount,
        themeCode: themeCode,
      ),
    );
  }

  @override
  Map<String, dynamic>? toJson(GameSettingsState state) {
    return <String, dynamic>{
      DefaultGameSettings.parameterCodeItemsCount: state.settings.itemsCount,
      DefaultGameSettings.parameterCodeThemeCode: state.settings.themeCode,
    };
  }
}