using System;
using System.Diagnostics;
using System.Threading.Tasks;
using Avalonia.Controls.ApplicationLifetimes;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Elfisa.Core;
namespace Elfisa.Avalonia.ViewModels;
/// Окно «Доступно обновление»: скачивает установщик и запускает его.
public partial class UpdateViewModel : ViewModelBase
{
private readonly UpdateInfo _info;
private readonly Action _close;
public UpdateViewModel(UpdateInfo info, Action close)
{
_info = info;
_close = close;
}
public string Message =>
$"Установлена версия {_info.CurrentVersion}.\nДоступна новая версия {_info.LatestVersion}.";
[ObservableProperty] private bool _busy;
[ObservableProperty] private double _progress;
[ObservableProperty] private string _status = "";
[RelayCommand]
private void Later() => _close();
[RelayCommand]
private async Task UpdateAsync()
{
// Не-Windows: установщика нет — открываем страницу релиза в браузере.
if (!OperatingSystem.IsWindows())
{
OpenUrl(string.IsNullOrWhiteSpace(_info.ReleaseUrl) ? "https://cdn.24pharmdata.ru" : _info.ReleaseUrl);
_close();
return;
}
try
{
Busy = true;
Status = "Скачивание обновления…";
var progress = new Progress(p =>
{
Progress = p;
Status = $"Скачивание обновления… {p:0}%";
});
var setupPath = await UpdateService.DownloadSetupAsync(progress);
Status = "Запуск установки…";
LaunchInstallerAndExit(setupPath);
}
catch (Exception ex)
{
Busy = false;
Status = "Не удалось обновить: " + ex.Message;
}
}
/// Тихая установка поверх + перезапуск приложения, затем закрываем себя.
private void LaunchInstallerAndExit(string setupPath)
{
var exe = Process.GetCurrentProcess().MainModule?.FileName;
var inner = $"\"{setupPath}\" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART";
if (!string.IsNullOrEmpty(exe))
inner += $" && start \"\" \"{exe}\"";
Process.Start(new ProcessStartInfo("cmd.exe")
{
Arguments = "/c \"" + inner + "\"",
UseShellExecute = false,
CreateNoWindow = true,
});
// Закрываем приложение, чтобы установщик заменил файлы (CloseApplications=yes).
if (global::Avalonia.Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime d)
d.Shutdown();
else
Environment.Exit(0);
}
private static void OpenUrl(string url)
{
try
{
Process.Start(new ProcessStartInfo(url) { UseShellExecute = true });
}
catch { /* игнорируем */ }
}
}