import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_state.dart'; import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; class AcBloc extends Bloc { AcStatusModel deviceStatus = AcStatusModel( uuid: '', acSwitch: true, modeString: 'hot', tempSet: 300, currentTemp: 315, fanSpeedsString: 'low', childLock: false, ); AcBloc() : super(AcsInitialState()) { on(_onFetchAcStatus); on(_onAcControl); on(_changeAcSwitch); on(_increaseCoolTo); on(_decreaseCoolTo); on(_changeLockValue); on(_changeAcMode); on(_changeFanSpeed); } FutureOr _onFetchAcStatus( AcFetchDeviceStatus event, Emitter emit) async { emit(AcsLoadingState()); try { final status = await DevicesManagementApi().getDeviceStatus(event.deviceId); deviceStatus = AcStatusModel.fromJson(status.productUuid, status.status); emit(ACStatusLoaded(deviceStatus)); } catch (e) { emit(AcsFailedState(error: e.toString())); } } FutureOr _onAcControl(AcControl event, Emitter emit) async { final oldValue = _getValueByCode(event.code); _updateLocalValue(event.code, event.value); emit(ACStatusLoaded(deviceStatus)); try { final status = Status(code: event.code, value: event.value); final response = await DevicesManagementApi().deviceControl(event.deviceId, status); if (!response) { _updateLocalValue(event.code, oldValue); emit(ACStatusLoaded(deviceStatus)); emit(AcsFailedState(error: 'Failed to control the device.')); } } catch (e) { _updateLocalValue(event.code, oldValue); emit(ACStatusLoaded(deviceStatus)); emit(AcsFailedState(error: 'Error controlling the device: $e')); } } void _updateLocalValue(String code, dynamic value) { switch (code) { case 'switch': deviceStatus.acSwitch = value; break; case 'temp_set': deviceStatus.tempSet = value; break; case 'mode': deviceStatus.modeString = value; deviceStatus.acMode = AcStatusModel.getACMode(value); break; case 'level': deviceStatus.fanSpeedsString = value; deviceStatus.acFanSpeed = AcStatusModel.getFanSpeed(value); break; case 'child_lock': deviceStatus.childLock = value; break; default: break; } } dynamic _getValueByCode(String code) { switch (code) { case 'switch': return deviceStatus.acSwitch; case 'temp_set': return deviceStatus.tempSet; case 'mode': return deviceStatus.modeString; case 'level': return deviceStatus.fanSpeedsString; case 'child_lock': return deviceStatus.childLock; default: return null; } } FutureOr _changeAcSwitch(AcSwitch event, Emitter emit) async { final newValue = !event.acSwitch; add(AcControl(deviceId: event.deviceId, code: 'switch', value: newValue)); } FutureOr _increaseCoolTo( IncreaseCoolToTemp event, Emitter emit) async { final newValue = (event.value * 10).toInt() + 5; if (_isValidTemperature(newValue)) { add(AcControl( deviceId: event.deviceId, code: 'temp_set', value: newValue)); } } FutureOr _decreaseCoolTo( DecreaseCoolToTemp event, Emitter emit) async { final newValue = (event.value * 10).toInt() - 5; if (_isValidTemperature(newValue)) { add(AcControl( deviceId: event.deviceId, code: 'temp_set', value: newValue)); } } FutureOr _changeLockValue( ChangeLock event, Emitter emit) async { final newValue = !event.lockBool; add(AcControl( deviceId: event.deviceId, code: 'child_lock', value: newValue)); } FutureOr _changeAcMode( ChangeAcMode event, Emitter emit) async { final newValue = AcStatusModel.getACMode(event.tempModes.name); add(AcControl(deviceId: event.deviceId, code: 'mode', value: newValue)); } FutureOr _changeFanSpeed( ChangeFanSpeed event, Emitter emit) async { final newValue = AcStatusModel.getFanSpeed(event.fanSpeeds.name); add(AcControl(deviceId: event.deviceId, code: 'level', value: newValue)); } bool _isValidTemperature(int value) { return value >= 200 && value <= 300; } }