enum WizProvisioningPermissionStatus { granted, requestable, settingsRequired } class WizProvisioningEnvironment { final String platform; final int? androidApiLevel; final bool smartPairingSupported; final bool wifiSettingsSupported; final bool appSettingsSupported; final WizProvisioningPermissionStatus permissionStatus; final bool locationServicesEnabled; final bool connectedToWifi; final String? ssid; final String? bssid; final int? frequencyMhz; const WizProvisioningEnvironment({ required this.platform, required this.androidApiLevel, required this.smartPairingSupported, required this.wifiSettingsSupported, required this.appSettingsSupported, required this.permissionStatus, required this.locationServicesEnabled, required this.connectedToWifi, required this.ssid, required this.bssid, required this.frequencyMhz, }); factory WizProvisioningEnvironment.unsupported() => const WizProvisioningEnvironment( platform: 'unknown', androidApiLevel: null, smartPairingSupported: false, wifiSettingsSupported: false, appSettingsSupported: false, permissionStatus: WizProvisioningPermissionStatus.granted, locationServicesEnabled: true, connectedToWifi: false, ssid: null, bssid: null, frequencyMhz: null, ); factory WizProvisioningEnvironment.fromMap(Map raw) { return WizProvisioningEnvironment( platform: raw['platform'] as String? ?? 'unknown', androidApiLevel: (raw['androidApiLevel'] as num?)?.toInt(), smartPairingSupported: raw['smartPairingSupported'] == true, wifiSettingsSupported: raw['wifiSettingsSupported'] == true, appSettingsSupported: raw['appSettingsSupported'] == true, permissionStatus: _permissionStatusFromPlatformValue( raw['permissionStatus'] as String?, ), locationServicesEnabled: raw['locationServicesEnabled'] != false, connectedToWifi: raw['connectedToWifi'] == true, ssid: _normalizeText(raw['ssid']), bssid: _normalizeText(raw['bssid']), frequencyMhz: (raw['frequencyMhz'] as num?)?.toInt(), ); } bool get permissionsGranted => permissionStatus == WizProvisioningPermissionStatus.granted; bool get permissionRequestable => permissionStatus == WizProvisioningPermissionStatus.requestable; bool get requiresAppSettings => permissionStatus == WizProvisioningPermissionStatus.settingsRequired; bool get isAndroid => platform == 'android'; bool get isOn24Ghz => frequencyMhz != null && frequencyMhz! >= 2400 && frequencyMhz! < 2500; bool get isLikelyOn5Ghz => frequencyMhz != null && frequencyMhz! >= 4900 && frequencyMhz! < 6000; WizProvisioningEnvironment copyWith({ String? platform, int? androidApiLevel, bool? smartPairingSupported, bool? wifiSettingsSupported, bool? appSettingsSupported, WizProvisioningPermissionStatus? permissionStatus, bool? locationServicesEnabled, bool? connectedToWifi, String? ssid, String? bssid, int? frequencyMhz, bool clearWifiInfo = false, }) { return WizProvisioningEnvironment( platform: platform ?? this.platform, androidApiLevel: androidApiLevel ?? this.androidApiLevel, smartPairingSupported: smartPairingSupported ?? this.smartPairingSupported, wifiSettingsSupported: wifiSettingsSupported ?? this.wifiSettingsSupported, appSettingsSupported: appSettingsSupported ?? this.appSettingsSupported, permissionStatus: permissionStatus ?? this.permissionStatus, locationServicesEnabled: locationServicesEnabled ?? this.locationServicesEnabled, connectedToWifi: connectedToWifi ?? this.connectedToWifi, ssid: clearWifiInfo ? null : (ssid ?? this.ssid), bssid: clearWifiInfo ? null : (bssid ?? this.bssid), frequencyMhz: clearWifiInfo ? null : (frequencyMhz ?? this.frequencyMhz), ); } static WizProvisioningPermissionStatus _permissionStatusFromPlatformValue( String? value, ) { switch (value) { case 'granted': return WizProvisioningPermissionStatus.granted; case 'settings_required': return WizProvisioningPermissionStatus.settingsRequired; case 'requestable': default: return WizProvisioningPermissionStatus.requestable; } } static String? _normalizeText(Object? raw) { final text = raw as String?; if (text == null) { return null; } final trimmed = text.trim(); return trimmed.isEmpty ? null : trimmed; } }