import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class VersionCheckService { Future checkForceUpdate() async { try { // 1. Capiamo su che piattaforma sta girando l'app in questo istante String currentPlatform = _getCurrentPlatform(); // 2. Recuperiamo SOLO la riga corrispondente alla nostra piattaforma final dbResponse = await Supabase.instance.client .from('app_config') .select('min_version, download_url') .eq('platform', currentPlatform) .maybeSingle(); // Usiamo maybeSingle così se non c'è la riga non crasha if (dbResponse == null) { return null; // Nessuna regola per questa piattaforma } String minVersionFromDb = dbResponse['min_version'] as String; String downloadUrl = dbResponse['download_url'] as String; // 3. Recuperiamo la versione locale di Flutter PackageInfo packageInfo = await PackageInfo.fromPlatform(); String localVersionRaw = packageInfo.version; // 🥷 TRUCCO 1: Pulizia totale dai build number (+37) o tag "v" String cleanLocal = localVersionRaw .split('+') .first .replaceAll('v', '') .trim(); String cleanDb = minVersionFromDb .split('+') .first .replaceAll('v', '') .trim(); // 🥷 TRUCCO 2: Confronto Semantico Reale if (_isVersionLower(current: cleanLocal, minimum: cleanDb)) { // Ritorna il link VERO per questa specifica piattaforma preso dal CSV! return downloadUrl; } return null; } catch (e) { debugPrint("Errore durante il check versione: $e"); return null; } } // Helper ninja per mappare le piattaforme in base alle stringhe del tuo DB String _getCurrentPlatform() { if (kIsWeb) return 'web'; if (Platform.isAndroid) return 'android'; if (Platform.isIOS) return 'ios'; if (Platform.isWindows) return 'windows'; if (Platform.isMacOS) return 'macos'; if (Platform.isLinux) return 'linux'; return 'unknown'; } // Il motore matematico (resta invariato) bool _isVersionLower({required String current, required String minimum}) { if (current == minimum) return false; List currentParts = current .split('.') .map((e) => int.tryParse(e) ?? 0) .toList(); List minParts = minimum .split('.') .map((e) => int.tryParse(e) ?? 0) .toList(); while (currentParts.length < 3) { currentParts.add(0); } while (minParts.length < 3) { minParts.add(0); } if (currentParts[0] != minParts[0]) { return currentParts[0] < minParts[0]; } if (currentParts[1] != minParts[1]) { return currentParts[1] < minParts[1]; } return currentParts[2] < minParts[2]; } }