using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Windows.ApplicationModel;
using Windows.System;
using Wino.Core.Domain.Interfaces;

namespace Wino.Server;

public partial class ServerViewModel : ObservableObject, IInitializeAsync
{
    private readonly INotificationBuilder _notificationBuilder;

    public ServerContext Context { get; }

    public ServerViewModel(ServerContext serverContext, INotificationBuilder notificationBuilder)
    {
        Context = serverContext;
        _notificationBuilder = notificationBuilder;
    }

    [RelayCommand]
    public Task LaunchWinoAsync()
    {
        return Launcher.LaunchUriAsync(new Uri($"{App.WinoMailLaunchProtocol}:")).AsTask();
    }

    /// <summary>
    /// Shuts down the application.
    /// </summary>
    [RelayCommand]
    public async Task ExitApplication()
    {
        // Find the running UWP app by AppDiagnosticInfo API and terminate it if possible.
        var appDiagnosticInfos = await AppDiagnosticInfo.RequestInfoForPackageAsync(Package.Current.Id.FamilyName);

        var clientDiagnosticInfo = appDiagnosticInfos.FirstOrDefault();

        if (clientDiagnosticInfo == null)
        {
            Debug.WriteLine($"Wino Mail client is not running. Termination is skipped.");
        }
        else
        {
            var appResourceGroupInfo = clientDiagnosticInfo.GetResourceGroups().FirstOrDefault();

            if (appResourceGroupInfo != null)
            {
                await appResourceGroupInfo.StartTerminateAsync();

                Debug.WriteLine($"Wino Mail client is terminated succesfully.");
            }
        }

        Application.Current.Shutdown();
    }

    public async Task ReconnectAsync() => await Context.InitializeAppServiceConnectionAsync();

    public Task InitializeAsync() => Context.InitializeAppServiceConnectionAsync();
}
