using Elwig.Helpers;
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Navigation;

namespace Elwig.Dialogs {
    public partial class UpdateDialog : Window {

        public string Version { get; private set; }
        public string Url { get; private set; }

        private readonly CancellationTokenSource Cancellation;

        public UpdateDialog(string version, string url, long size) {
            Version = version;
            Url = url;
            Cancellation = new();
            InitializeComponent();
            VersionText.Text = version;
            SizeText.Text = $"{size / 1024 / 1024}";
        }

        private void OnClosed(object sender, EventArgs evt) {
            Cancellation.Cancel();
        }

        private async void InstallButton_Click(object sender, RoutedEventArgs evt) {
            Description.Visibility = Visibility.Hidden;
            ProgressBar.Visibility = Visibility.Visible;
            InstallButton.IsEnabled = false;
            await Install();
            Close();
        }

        public async Task Install() {
            var fileName = Path.Combine(App.TempPath, $"Elwig-{Version}.exe");
            try {
                using var stream = new FileStream(fileName, FileMode.Create);
                using var client = new HttpClient() {
                    Timeout = TimeSpan.FromSeconds(5),
                };
                await client.DownloadAsync(Url, stream, new Progress<double>(p => {
                    ProgressBar.Value = p * 100.0;
                }), Cancellation.Token);
            } catch (OperationCanceledException) {
                File.Delete(fileName);
                return;
            } catch (Exception exc) {
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            Process.Start(fileName);
            DialogResult = true;
        }

        private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) {
            Process.Start(new ProcessStartInfo {
                FileName = e.Uri.ToString(),
                UseShellExecute = true,
            });
        }
    }
}