import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; import 'package:syncrow_web/pages/routiens/models/ac/ac_operational_value.dart'; import 'package:syncrow_web/pages/routiens/models/device_functions.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; abstract class ACFunction extends DeviceFunction { ACFunction({ required String deviceId, required String deviceName, required String code, required String operationName, required String icon, }) : super( deviceId: deviceId, deviceName: deviceName, code: code, operationName: operationName, icon: icon, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue); List getOperationalValues(); } class SwitchFunction extends ACFunction { SwitchFunction({required super.deviceId, required super.deviceName}) : super( code: 'switch', operationName: 'Power', icon: Assets.assetsAcPower, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue) { return currentStatus.copyWith(acSwitch: newValue as bool); } @override List getOperationalValues() => [ ACOperationalValue( icon: Assets.assetsAcPower, description: "ON", value: true, ), ACOperationalValue( icon: Assets.assetsAcPowerOFF, description: "OFF", value: false, ), ]; } class ModeFunction extends ACFunction { ModeFunction({required super.deviceId, required super.deviceName}) : super( code: 'mode', operationName: 'Mode', icon: Assets.assetsFreezing, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue) { return currentStatus.copyWith(modeString: (newValue as TempModes).toString().split('.').last); } @override List getOperationalValues() => [ ACOperationalValue( icon: Assets.assetsAcCooling, description: "Cooling", value: TempModes.cold, ), ACOperationalValue( icon: Assets.assetsAcHeating, description: "Heating", value: TempModes.hot, ), ACOperationalValue( icon: Assets.assetsFanSpeed, description: "Ventilation", value: TempModes.wind, ), ]; } class TempSetFunction extends ACFunction { final int min; final int max; final int step; TempSetFunction({required super.deviceId, required super.deviceName}) : min = 200, max = 300, step = 5, super( code: 'temp_set', operationName: 'Set Temperature', icon: Assets.assetsTempreture, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue) { return currentStatus.copyWith(tempSet: newValue as int); } @override List getOperationalValues() { List values = []; for (int temp = min; temp <= max; temp += step) { values.add(ACOperationalValue( icon: Assets.assetsTempreture, description: "${temp / 10}°C", value: temp, )); } return values; } } class LevelFunction extends ACFunction { LevelFunction({required super.deviceId, required super.deviceName}) : super( code: 'level', operationName: 'Fan Speed', icon: Assets.assetsFanSpeed, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue) { return currentStatus.copyWith(fanSpeedsString: (newValue as FanSpeeds).toString().split('.').last); } @override List getOperationalValues() => [ ACOperationalValue( icon: Assets.assetsAcFanLow, description: "LOW", value: FanSpeeds.low, ), ACOperationalValue( icon: Assets.assetsAcFanMiddle, description: "MIDDLE", value: FanSpeeds.middle, ), ACOperationalValue( icon: Assets.assetsAcFanHigh, description: "HIGH", value: FanSpeeds.high, ), ACOperationalValue( icon: Assets.assetsAcFanAuto, description: "AUTO", value: FanSpeeds.auto, ), ]; } class ChildLockFunction extends ACFunction { ChildLockFunction({required super.deviceId, required super.deviceName}) : super( code: 'child_lock', operationName: 'Child Lock', icon: Assets.assetsChildLock, ); @override AcStatusModel execute(AcStatusModel currentStatus, dynamic newValue) { return currentStatus.copyWith(childLock: newValue as bool); } @override List getOperationalValues() => [ ACOperationalValue( icon: Assets.assetsSceneChildLock, description: "Lock", value: true, ), ACOperationalValue( icon: Assets.assetsSceneChildUnlock, description: "Unlock", value: false, ), ]; } /* final deviceId = 'AC001'; final deviceName = 'Living Room AC'; // Initial AC status var acStatus = AcStatusModel( uuid: deviceId, acSwitch: false, modeString: 'cold', tempSet: 220, currentTemp: 250, fanSpeedsString: 'auto', childLock: false, ); // Get all AC functions final acFunctions = getACFunctions(deviceId, deviceName); // Example: Turn on the AC final switchFunction = acFunctions.firstWhere((f) => f is SwitchFunction) as SwitchFunction; acStatus = switchFunction.execute(acStatus, true); // Example: Change mode to heat final modeFunction = acFunctions.firstWhere((f) => f is ModeFunction) as ModeFunction; acStatus = modeFunction.execute(acStatus, TempModes.hot); */