using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Katteker.Properties;
using Katteker.Types;

namespace Katteker
{
    /// <summary>
    ///     The wrapper to add Katteker-capability to older Programs.
    /// </summary>
    public static class UserInterface
    {
        private static UpdateManager _manager;

        /// <summary>
        ///     Checks for Updates.
        /// </summary>
        /// <returns>Task</returns>
        public static Task CheckForUpdateAsync() => CheckForUpdateAsync(false);

        /// <summary>
        ///     Checks for Updates.
        /// </summary>
        /// <param name="isStartup">Is this Method called on Startup of the Program.</param>
        /// <returns>Task</returns>
        public static async Task CheckForUpdateAsync(bool isStartup)
        {
            if (_manager is null && !UpdateManager.TryCreate(out _manager))
            {
                if (!isStartup)
                {
                    MessageBox.Show(Resources.SquirrelWrapper_CheckForUpdate,
                        Resources.SquirrelWrapper_CheckForUpdate_Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                return;
            }

            var releases = await _manager.CheckForUpdatesAsync().ConfigureAwait(false);
            if (releases.Count > 0 || !isStartup)
            {
                var thread = new Thread(ThreadProcess);
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start(releases.LastOrDefault());
                thread.Join();
            }
        }

        private static void ThreadProcess(object argument)
        {
            var entry = (ReleaseEntry)argument;
            using var window = new UpdateWindow(_manager, entry);
            var dialogResult = window.ShowDialog();
            if (dialogResult == DialogResult.OK)
            {
                _manager.RestartApp();
            }
        }
    }
}