import 'dart:convert'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/rotation_config.dart'; import 'supabase_provider.dart'; /// Key used to store the rotation configuration in `app_settings`. const _settingsKey = 'rotation_config'; /// Provides the current [RotationConfig] from `app_settings`. final rotationConfigProvider = FutureProvider((ref) async { final client = ref.watch(supabaseClientProvider); final row = await client .from('app_settings') .select() .eq('key', _settingsKey) .maybeSingle(); if (row == null) return RotationConfig(); final value = row['value']; if (value is Map) { return RotationConfig.fromJson(value); } if (value is String) { return RotationConfig.fromJson(jsonDecode(value) as Map); } return RotationConfig(); }); /// Controller for persisting [RotationConfig] changes. final rotationConfigControllerProvider = Provider(( ref, ) { final client = ref.watch(supabaseClientProvider); return RotationConfigController(client, ref); }); class RotationConfigController { RotationConfigController(this._client, this._ref); final dynamic _client; final Ref _ref; Future save(RotationConfig config) async { await _client.from('app_settings').upsert({ 'key': _settingsKey, 'value': config.toJson(), }); _ref.invalidate(rotationConfigProvider); } Future updateShiftTypes(List shiftTypes) async { final config = await _ref.read(rotationConfigProvider.future); await save(config.copyWith(shiftTypes: shiftTypes)); } Future updateRoleWeeklyHours(Map roleWeeklyHours) async { final config = await _ref.read(rotationConfigProvider.future); await save(config.copyWith(roleWeeklyHours: roleWeeklyHours)); } Future updateHolidays(List holidays) async { final config = await _ref.read(rotationConfigProvider.future); await save(config.copyWith(holidays: holidays)); } Future setHolidaySync({ required bool enabled, required int year, required List holidays, }) async { final config = await _ref.read(rotationConfigProvider.future); await save( config.copyWith( syncPhilippinesHolidays: enabled, holidaysYear: year, holidays: holidays, ), ); } }