import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';

import 'package:random/models/interface_type.dart';

part 'settings_state.dart';

class SettingsCubit extends HydratedCubit<SettingsState> {
  SettingsCubit() : super(const SettingsState());

  Object getSetting(String key, [String? defaultValue]) {
    if (state.values.keys.contains(key)) {
      return state.values[key] ?? defaultValue ?? '';
    }

    return defaultValue ?? '';
  }

  String getApiUrl() {
    return state.apiUrl ?? '';
  }

  String getSecurityToken() {
    return state.securityToken ?? '';
  }

  InterfaceType getInterfaceType() {
    return state.interfaceType ?? InterfaceType.basic;
  }

  void setValues({
    String? apiUrl,
    String? securityToken,
    InterfaceType? interfaceType,
  }) {
    emit(SettingsState(
      apiUrl: apiUrl ?? state.apiUrl,
      securityToken: securityToken ?? state.securityToken,
      interfaceType: interfaceType ?? state.interfaceType,
    ));
  }

  @override
  SettingsState? fromJson(Map<String, dynamic> json) {
    String apiUrl = json['apiUrl'] as String;
    String securityToken = json['securityToken'] as String;
    InterfaceType interfaceType;

    switch (json['interfaceType'] as String) {
      case 'InterfaceType.basic':
        interfaceType = InterfaceType.basic;
        break;
      case 'InterfaceType.expert':
        interfaceType = InterfaceType.expert;
        break;
      default:
        interfaceType = InterfaceType.basic;
    }

    return SettingsState(
      apiUrl: apiUrl,
      securityToken: securityToken,
      interfaceType: interfaceType,
    );
  }

  @override
  Map<String, String>? toJson(SettingsState state) {
    return <String, String>{
      'apiUrl': state.apiUrl ?? '',
      'securityToken': state.securityToken ?? '',
      'interfaceType': state.interfaceType.toString(),
    };
  }
}