import 'dart:convert';

import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:shared_preferences/shared_preferences.dart';

part 'settings.freezed.dart';
part 'settings.g.dart';

enum ColorSchemeSettings { light, dark, system }

@freezed
abstract class Settings with _$Settings {
  const factory Settings({
    @Default(ColorSchemeSettings.system) ColorSchemeSettings colorScheme,
  }) = _Settings;

  factory Settings.fromJson(Map<String, Object?> json) =>
      _$SettingsFromJson(json);
}

@freezed
abstract class SettingsWrapper with _$SettingsWrapper {
  const factory SettingsWrapper({@Default(Settings()) Settings settings}) =
      _SettingsWrapper;
}

class SettingsCubit extends Cubit<SettingsWrapper> {
  final SharedPreferencesAsync _prefs = SharedPreferencesAsync();

  SettingsCubit() : super(SettingsWrapper());

  Future<void> loadSettings() async {
    final value = await _prefs.getString("settings");
    if (value == null) {
      await _prefs.setString("settings", jsonEncode(Settings().toJson()));
      return;
    }

    emit(state.copyWith(settings: Settings.fromJson(jsonDecode(value))));
  }

  Future<void> setSettings(Settings settings) async {
    emit(state.copyWith(settings: settings));

    await _prefs.setString("settings", jsonEncode(settings.toJson()));
  }
}