// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using interop;
using ManagedCommon;

namespace PowerAccent.UI;

internal static class Program
{
    private static readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
    private static App _application;
    private static int _powerToysRunnerPid;

    [STAThread]
    public static void Main(string[] args)
    {
        Logger.InitializeLogger("\\QuickAccent\\Logs");

        if (PowerToys.GPOWrapper.GPOWrapper.GetConfiguredQuickAccentEnabledValue() == PowerToys.GPOWrapper.GpoRuleConfigured.Disabled)
        {
            Logger.LogWarning("Tried to start with a GPO policy setting the utility to always be disabled. Please contact your systems administrator.");
            return;
        }

        Arguments(args);

        InitEvents();

        _application = new App();
        _application.InitializeComponent();
        _application.Run();
    }

    private static void InitEvents()
    {
        Task.Run(
            () =>
            {
                EventWaitHandle eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Constants.PowerAccentExitEvent());
                if (eventHandle.WaitOne())
                {
                    Terminate();
                }
            },
            _tokenSource.Token);
    }

    private static void Arguments(string[] args)
    {
        if (args?.Length > 0)
        {
            try
            {
                if (int.TryParse(args[0], out _powerToysRunnerPid))
                {
                    Logger.LogInfo($"QuickAccent started from the PowerToys Runner. Runner pid={_powerToysRunnerPid}");

                    RunnerHelper.WaitForPowerToysRunner(_powerToysRunnerPid, () =>
                    {
                        Logger.LogInfo("PowerToys Runner exited. Exiting QuickAccent");
                        Terminate();
                    });
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
        else
        {
            Logger.LogInfo($"QuickAccent started detached from PowerToys Runner.");
            _powerToysRunnerPid = -1;
        }
    }

    private static void Terminate()
    {
        Application.Current.Dispatcher.BeginInvoke(() =>
        {
            _tokenSource.Cancel();
            Application.Current.Shutdown();
        });
    }
}
