import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:umbrix/core/model/environment.dart'; part 'remote_version_entity.freezed.dart'; @Freezed() class RemoteVersionEntity with _$RemoteVersionEntity { const RemoteVersionEntity._(); const factory RemoteVersionEntity({ required String version, required String buildNumber, required String releaseTag, required bool preRelease, required String url, required DateTime publishedAt, required Environment flavor, @Default([]) List assets, }) = _RemoteVersionEntity; String get presentVersion => flavor == Environment.prod ? version : "$version ${flavor.name}"; /// Найти asset по расширению файла с умным определением String? findAssetByExtension(String extension) { try { // Для Linux используем приоритет: .deb > .rpm > .AppImage if (extension == '.deb' || extension == '.rpm' || extension == '.AppImage') { final priorities = ['.deb', '.rpm', '.AppImage']; for (final ext in priorities) { try { final asset = assets.firstWhere((asset) => asset.name.endsWith(ext)); return asset.downloadUrl; } catch (_) { continue; } } return null; } // Для Windows - ищем .exe с приоритетом x64 if (extension == '.exe') { // Сначала ищем x64 setup/installer for (final pattern in ['x64', 'amd64', 'win64', 'setup', 'installer']) { try { final asset = assets.firstWhere( (asset) => asset.name.toLowerCase().contains(pattern) && asset.name.endsWith('.exe'), ); return asset.downloadUrl; } catch (_) { continue; } } // Если не нашли специфичный - берём любой .exe try { final asset = assets.firstWhere((asset) => asset.name.endsWith('.exe')); return asset.downloadUrl; } catch (_) { return null; } } // Для macOS - ищем .dmg if (extension == '.dmg') { // Сначала ищем universal или arm64 (для M1/M2) for (final pattern in ['universal', 'arm64', 'apple-silicon']) { try { final asset = assets.firstWhere( (asset) => asset.name.toLowerCase().contains(pattern) && asset.name.endsWith('.dmg'), ); return asset.downloadUrl; } catch (_) { continue; } } // Если не нашли - берём любой .dmg try { final asset = assets.firstWhere((asset) => asset.name.endsWith('.dmg')); return asset.downloadUrl; } catch (_) { return null; } } // Для других расширений - прямой поиск return assets.firstWhere((asset) => asset.name.endsWith(extension)).downloadUrl; } catch (_) { return null; } } } @freezed class ReleaseAsset with _$ReleaseAsset { const factory ReleaseAsset({ required String name, required String downloadUrl, required int size, }) = _ReleaseAsset; }