import 'package:syncrow_app/features/devices/model/function_model.dart'; import 'package:syncrow_app/features/scene/enum/ac_values.dart'; import 'package:syncrow_app/features/scene/enum/operation_dialog_type.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/ac_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/door_lock_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/gateway_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/human_presence_functions.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/presence_sensor.dart'; import 'package:syncrow_app/features/scene/helper/functions_per_device/three_gang_functions.dart'; import 'package:syncrow_app/features/scene/model/scene_details_model.dart'; import 'package:syncrow_app/features/scene/model/scene_static_function.dart'; import 'package:syncrow_app/generated/assets.dart'; import 'package:syncrow_app/utils/resource_manager/constants.dart'; mixin SceneOperationsDataHelper { List getFunctionsWithIcons({ DeviceType? type, required List functions, required String deviceId, required String deviceName, required bool isAutomation, }) { const functionValue = null; switch (type) { case DeviceType.LightBulb: return lightBulbFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.CeilingSensor: return ceilingSensorFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.WallSensor: return wallSensorFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.AC: return acFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.DoorLock: return doorLockFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.Curtain: return curtainFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.ThreeGang: return threeGangFunctions( functions, deviceId, deviceName, functionValue, isAutomation); case DeviceType.Gateway: return gatewayFunctions( functions, deviceId, deviceName, functionValue, isAutomation); default: return lightBulbFunctions( functions, deviceId, deviceName, functionValue, isAutomation); } } String getTitle({DeviceType? type}) { switch (type) { case DeviceType.LightBulb: return 'Light Bulb Functions'; case DeviceType.CeilingSensor: return 'Presence Sensor Functions'; case DeviceType.WallSensor: return 'Human Presence Sensor Functions'; case DeviceType.AC: return 'AC Functions'; case DeviceType.DoorLock: return 'Door Lock Functions'; case DeviceType.Curtain: return 'Curtain Functions'; case DeviceType.ThreeGang: return '3G Light Switch Functions'; case DeviceType.Gateway: return 'Gateway Functions'; default: return ''; } } List ceilingSensorFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { if (isAutomation) { return PresenceSensorHelperFunctions.automationPresenceSensorFunctions( deviceId, deviceName, functionValue); } return PresenceSensorHelperFunctions.tabToRunPresenceSensorFunctions( deviceId, deviceName, functionValue); } List curtainFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { return []; } List doorLockFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { if (isAutomation) { return DoorLockHelperFunctions.doorLockAutomationFunctions( deviceId, deviceName, functionValue); } return DoorLockHelperFunctions.doorLockTapToRunFunctions( deviceId, deviceName, functionValue); } List wallSensorFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { if (isAutomation) { return HumanPresenceHelperFunctions.automationHumanPresenceFunctions( deviceId, deviceName, functionValue); } return HumanPresenceHelperFunctions.tabToRunHumanPresenceFunctions( deviceId, deviceName, functionValue); } List lightBulbFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { return []; } List gatewayFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { return GatewayHelperFunctions.tabToRunGatewayFunctions( deviceId, deviceName, functionValue); } List threeGangFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { if (isAutomation) { return ThreeGangHelperFunctions.threeGangAutomationFunctions( deviceId, deviceName, functionValue); } return ThreeGangHelperFunctions.threeGangHelperFunctions( deviceId, deviceName, functionValue); } List acFunctions( List functions, String deviceId, String deviceName, dynamic functionValue, bool isAutomation) { if (isAutomation) { return ACFunctionsHelper.automationAcFunctions( deviceId, deviceName, functionValue); } return ACFunctionsHelper.tabToRunAcFunctions( deviceId, deviceName, functionValue); } List getTaskListFunctionsFromApi( {required List actions, required bool isAutomation}) { List functions = []; for (var action in actions) { if (action.entityId == 'delay') { functions.add( SceneStaticFunction( deviceId: action.entityId, deviceName: 'delay', deviceIcon: Assets.delay, icon: Assets.delay, operationName: 'delay', operationDialogType: OperationDialogType.delay, functionValue: action.executorProperty.delaySeconds, code: '', operationalValues: [ SceneOperationalValue( icon: '', description: "", value: action.executorProperty.delaySeconds), ], ), ); } else { functions .add(_mapExecutorPropertyToSceneFunction(action, isAutomation)); } } return functions; } SceneStaticFunction _mapExecutorPropertyToSceneFunction( Action action, bool isAutomation) { ExecutorProperty executorProperty = action.executorProperty; /* if (type == DeviceType.LightBulb) { tempIcon = Assets.assetsIconsLight; } else if (type == DeviceType.CeilingSensor || type == DeviceType.WallSensor) { tempIcon = Assets.assetsIconsSensors; } else if (type == DeviceType.AC) { tempIcon = Assets.assetsIconsAC; } else if (type == DeviceType.DoorLock) { tempIcon = Assets.assetsIconsDoorLock; } else if (type == DeviceType.Curtain) { tempIcon = Assets.assetsIconsCurtain; } else if (type == DeviceType.ThreeGang) { tempIcon = Assets.assetsIcons3GangSwitch; } else if (type == DeviceType.Gateway) { tempIcon = Assets.assetsIconsGateway; } else { tempIcon = Assets.assetsIconsLogo; } */ switch (executorProperty.functionCode) { case 'sensitivity': return _createSceneFunction( action, 'Presence Sensor', Assets.assetsIconsSensors, 'Sensitivity', isAutomation ? OperationDialogType.integerSteps : OperationDialogType.listOfOptions, isAutomation ? _createIntegerStepsOptions() : _createSensitivityOptions(), isAutomation); case 'normal_open_switch': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Set Door lock Normal Open', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'unlock_fingerprint': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Fingerprint Unlock', OperationDialogType.integerSteps, _createFingerprintUnlockOptions(), isAutomation); case 'unlock_password': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Password Unlock', OperationDialogType.integerSteps, _createPasswordUnlockOptions(), isAutomation); case 'unlock_card': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Card Unlock', OperationDialogType.integerSteps, _createCardUnlockOptions(), isAutomation); case 'alarm_lock': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Lock Alarm', OperationDialogType.listOfOptions, _createLockAlarmOptions(), isAutomation); case 'unlock_request': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Remote Unlock Request', OperationDialogType.integerSteps, _createUnlockRequestOptions(), isAutomation); case 'residual_electricity': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Residual Electricity', OperationDialogType.integerSteps, _createResidualElectricityOptions(), isAutomation); case 'reverse_lock': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Double Lock', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'unlock_app': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Remote Unlock Via App', OperationDialogType.integerSteps, _createUnlockAppOptions(), isAutomation); case 'hijack': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Hijack Alarm', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'doorbell': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Doorbell', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'unlock_temporary': return _createSceneFunction( action, 'WIFI LOCK PRO', Assets.assetsIconsDoorLock, 'Temporary Password Unlock', OperationDialogType.integerSteps, _createTemporaryPasswordUnlockOptions(), isAutomation); case 'far_detection': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Far Detection', OperationDialogType.listOfOptions, _createFarDetectionOptions(), isAutomation); case 'motion_sensitivity_value': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Motion Detection Sensitivity', OperationDialogType.listOfOptions, _createSensitivityOptions(), isAutomation); case 'motionless_sensitivity': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Motionless Detection Sensitivity', OperationDialogType.listOfOptions, _createSensitivityOptions(), isAutomation); case 'indicator': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Indicator', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'presence_time': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Nobody Time', OperationDialogType.countdown, _createCountdownOptions(), isAutomation); case 'presence_state': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Presence State', OperationDialogType.listOfOptions, _createPresenceStateOptions(), isAutomation); case 'dis_current': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Current Distance', OperationDialogType.integerSteps, _createCurrentDistanceOptions(), isAutomation); case 'illuminance_value': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Illuminance Value', OperationDialogType.integerSteps, _createIlluminanceValueOptions(), isAutomation); case 'checking_result': return _createSceneFunction( action, 'Human Presence Sensor', Assets.assetsIconsSensors, 'Self-Test Result', OperationDialogType.listOfOptions, _createSelfTestResultOptions(), isAutomation); case 'switch': return _createSceneFunction( action, 'Smart AC Thermostat - Grey - Model A', Assets.assetsIconsAC, 'Power', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'temp_set': return _createSceneFunction( action, 'Smart AC Thermostat - Grey - Model A', Assets.assetsIconsAC, 'Set Temperature', isAutomation ? OperationDialogType.integerSteps : OperationDialogType.temperature, isAutomation ? _createAutomationTemperatureOptions() : _createTemperatureOptions(), isAutomation); case 'mode': return _createSceneFunction( action, 'Smart AC Thermostat - Grey - Model A', Assets.assetsIconsAC, 'Mode', OperationDialogType.listOfOptions, _createAcModeOptions(), isAutomation); case 'level': return _createSceneFunction( action, 'Smart AC Thermostat - Grey - Model A', Assets.assetsIconsAC, 'Fan Speed', OperationDialogType.listOfOptions, _createFanSpeedOptions(), isAutomation); case 'child_lock': return _createSceneFunction( action, 'Smart AC Thermostat - Grey - Model A', Assets.assetsIconsAC, 'Child Lock', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'switch_1': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 1 Switch', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'switch_2': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 2 Switch', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'switch_3': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 3 Switch', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'countdown_1': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 1 CountDown', isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), isAutomation); case 'countdown_2': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 2 CountDown', isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), isAutomation); case 'countdown_3': return _createSceneFunction( action, '3 Gang Button Switch L-L', Assets.assetsIcons3GangSwitch, 'Light 3 CountDown', isAutomation ? OperationDialogType.integerSteps : OperationDialogType.countdown, isAutomation ? _createAutomationCountDownOptions() : _createCountdownOptions(), isAutomation); case 'switch_alarm_sound': return _createSceneFunction( action, 'Gateway', Assets.assetsIconsGateway, 'Switch Alarm Sound', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); case 'master_state': return _createSceneFunction( action, 'Gateway', Assets.assetsIconsGateway, 'Master State', OperationDialogType.listOfOptions, _createMasterStateOptions(), isAutomation); case 'factory_reset': return _createSceneFunction( action, 'Gateway', Assets.assetsIconsGateway, 'Factory Reset', OperationDialogType.onOff, _createOnOffOptions(), isAutomation); default: throw ArgumentError( 'Unsupported function code: ${executorProperty.functionCode}'); } } List _createFingerprintUnlockOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0.0, maxValue: 999, stepValue: 1.0, ), ]; } List _createPasswordUnlockOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0.0, maxValue: 999, stepValue: 1.0, ), ]; } List _createCardUnlockOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0.0, maxValue: 999, stepValue: 1.0, ), ]; } List _createLockAlarmOptions() { return [ SceneOperationalValue( icon: Assets.assetsFingerprintUnlock, description: "Fingerprint Mismatch", value: 0, ), ]; } List _createUnlockRequestOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0, maxValue: 90, stepValue: 1, ), ]; } List _createResidualElectricityOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0, maxValue: 100, stepValue: 1, ), ]; } List _createUnlockAppOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0, maxValue: 999, stepValue: 1, ), ]; } List _createTemporaryPasswordUnlockOptions() { return [ SceneOperationalValue( icon: '', description: "", value: 0.0, minValue: 0, maxValue: 999, stepValue: 1, ), ]; } List _createPresenceStateOptions() { return [ SceneOperationalValue( icon: Assets.assetsIconsPresenceSensorAssetsEmpty, value: 'none', description: 'None', ), SceneOperationalValue( icon: Assets.assetsPresence, value: 'presence', description: 'Presence', ), ]; } List _createCurrentDistanceOptions() { return [ SceneOperationalValue( icon: '', value: 0.0, description: "CM", minValue: 1, maxValue: 600, stepValue: 1, ), ]; } List _createIlluminanceValueOptions() { return [ SceneOperationalValue( icon: '', value: 0.0, description: "Lux", minValue: 0, maxValue: 10000, stepValue: 1, ), ]; } List _createSelfTestResultOptions() { return [ SceneOperationalValue( icon: Assets.assetsSelfTestResult, value: 'check_success', description: 'Self Testing Success', ), ]; } List _createAutomationTemperatureOptions() { return [ SceneOperationalValue( icon: Assets.assetsCelsiusDegrees, value: 0.0, description: '°C', minValue: 20, maxValue: 30, stepValue: 0.5) ]; } List _createIntegerStepsOptions() { return [ SceneOperationalValue( icon: '', value: 0.0, description: "CM", minValue: 1, maxValue: 600, stepValue: 1) ]; } _createAutomationCountDownOptions() { return [ SceneOperationalValue( icon: '', description: "sec", value: 0.0, minValue: 0, maxValue: 43200, stepValue: 1, ) ]; } SceneStaticFunction _createSceneFunction( Action action, String deviceName, String icon, String operationName, OperationDialogType operationDialogType, List operationalValues, bool isAutomation) { final functionValue = action.executorProperty.functionValue; return SceneStaticFunction( deviceId: action.entityId, deviceName: deviceName, deviceIcon: icon, icon: icon, operationName: operationName, functionValue: functionValue, code: action.executorProperty.functionCode ?? '', operationDialogType: operationDialogType, operationalValues: operationalValues, ); } List _createOnOffOptions() { return [ SceneOperationalValue( icon: Assets.assetsAcPower, description: "ON", value: true), SceneOperationalValue( icon: Assets.assetsAcPowerOFF, description: "OFF", value: false), ]; } List _createSensitivityOptions() { return List.generate( 10, (index) => SceneOperationalValue( icon: Assets.assetsSensitivityOperationIcon, value: index + 1, description: (index + 1).toString())); } List _createFarDetectionOptions() { final distances = [75, 150, 225, 300, 375, 450, 525, 600]; return distances .map((distance) => SceneOperationalValue( icon: Assets.assetsFarDetectionFunction, value: distance, description: '${distance}cm', iconValue: distance.toString())) .toList(); } List _createTemperatureOptions() { return [ SceneOperationalValue( icon: Assets.assetsCelsiusDegrees, value: 0, description: 'COOL TO') ]; } List _createMasterStateOptions() { return [ SceneOperationalValue( icon: Assets.assetsAcPower, description: "Alarm", value: 'alarm'), SceneOperationalValue( icon: Assets.assetsAcPowerOFF, description: "Normal", value: 'normal'), ]; } List _createAcModeOptions() { return [ SceneOperationalValue( icon: Assets.assetsAcCooling, description: AcValuesEnums.Cooling.name, value: TempModes.cold.name), SceneOperationalValue( icon: Assets.assetsAcHeating, description: AcValuesEnums.Heating.name, value: TempModes.hot.name), SceneOperationalValue( icon: Assets.assetsFanSpeed, description: AcValuesEnums.Ventilation.name, value: TempModes.wind.name), ]; } List _createFanSpeedOptions() { return [ SceneOperationalValue( icon: Assets.assetsAcFanLow, description: ValueACRange.LOW.name, value: FanSpeeds.low.name), SceneOperationalValue( icon: Assets.assetsAcFanMiddle, description: ValueACRange.MIDDLE.name, value: FanSpeeds.middle.name), SceneOperationalValue( icon: Assets.assetsAcFanHigh, description: ValueACRange.HIGH.name, value: FanSpeeds.high.name), SceneOperationalValue( icon: Assets.assetsAcFanAuto, description: ValueACRange.AUTO.name, value: FanSpeeds.auto.name), ]; } List _createCountdownOptions() { return [SceneOperationalValue(icon: '', value: 0)]; } List getOperationsForOneFunction({ required String deviceId, required SceneStaticFunction taskItem, required bool isAutomation, }) { if (deviceId.contains('delay')) { return [ SceneStaticFunction( deviceId: taskItem.deviceId, deviceName: 'delay', deviceIcon: Assets.delay, icon: Assets.delay, operationName: 'delay', functionValue: taskItem.functionValue, code: '', operationDialogType: OperationDialogType.delay, operationalValues: [ SceneOperationalValue(icon: '', description: "", value: 0) ], ), ]; } return [ _mapExecutorPropertyToSceneFunction( Action( entityId: deviceId, executorProperty: ExecutorProperty( functionCode: taskItem.code, functionValue: taskItem.functionValue), actionExecutor: ''), isAutomation) ]; } }