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

import 'package:momomotus/config/default_activity_settings.dart';
import 'package:momomotus/models/settings/settings_activity.dart';

part 'settings_activity_state.dart';

class ActivitySettingsCubit extends HydratedCubit<ActivitySettingsState> {
  ActivitySettingsCubit()
      : super(ActivitySettingsState(settings: ActivitySettings.createDefault()));

  void setValues({
    String? lang,
    String? length,
    String? level,
  }) {
    emit(
      ActivitySettingsState(
        settings: ActivitySettings(
          lang: lang ?? state.settings.lang,
          length: length ?? state.settings.length,
          level: level ?? state.settings.level,
        ),
      ),
    );
  }

  String getParameterValue(String code) {
    switch (code) {
      case DefaultActivitySettings.parameterCodeLang:
        return ActivitySettings.getLangValueFromUnsafe(state.settings.lang);
      case DefaultActivitySettings.parameterCodeLength:
        return ActivitySettings.getLengthValueFromUnsafe(state.settings.length);
      case DefaultActivitySettings.parameterCodeLevel:
        return ActivitySettings.getLevelValueFromUnsafe(state.settings.level);
    }

    return '';
  }

  void setParameterValue(String code, String value) {
    final String lang = code == DefaultActivitySettings.parameterCodeLang
        ? value
        : getParameterValue(DefaultActivitySettings.parameterCodeLang);
    final String length = code == DefaultActivitySettings.parameterCodeLength
        ? value
        : getParameterValue(DefaultActivitySettings.parameterCodeLength);
    final String level = code == DefaultActivitySettings.parameterCodeLevel
        ? value
        : getParameterValue(DefaultActivitySettings.parameterCodeLevel);

    setValues(
      lang: lang,
      length: length,
      level: level,
    );
  }

  @override
  ActivitySettingsState? fromJson(Map<String, dynamic> json) {
    final String lang = json[DefaultActivitySettings.parameterCodeLang] as String;
    final String length = json[DefaultActivitySettings.parameterCodeLength] as String;
    final String level = json[DefaultActivitySettings.parameterCodeLevel] as String;

    return ActivitySettingsState(
      settings: ActivitySettings(
        lang: lang,
        length: length,
        level: level,
      ),
    );
  }

  @override
  Map<String, dynamic>? toJson(ActivitySettingsState state) {
    return <String, dynamic>{
      DefaultActivitySettings.parameterCodeLang: state.settings.lang,
      DefaultActivitySettings.parameterCodeLength: state.settings.length,
      DefaultActivitySettings.parameterCodeLevel: state.settings.level,
    };
  }
}