using System;
using System.Diagnostics.CodeAnalysis;
using System.Windows.Forms;
using TweetDuck.Controls;
using TweetLib.Core.Systems.Updates;

namespace TweetDuck.Browser.Bridge{
    [SuppressMessage("ReSharper", "UnusedMember.Global")]
    class UpdateBridge{
        private readonly UpdateHandler updates;
        private readonly Control sync;

        private UpdateInfo nextUpdate = null;

        public event EventHandler<UpdateInfo> UpdateAccepted;
        public event EventHandler<UpdateInfo> UpdateDismissed;

        public UpdateBridge(UpdateHandler updates, Control sync){
            this.sync = sync;

            this.updates = updates;
            this.updates.CheckFinished += updates_CheckFinished;
        }

        internal void Cleanup(){
            updates.CheckFinished -= updates_CheckFinished;
            nextUpdate?.DeleteInstaller();
        }

        private void updates_CheckFinished(object sender, UpdateCheckEventArgs e){
            UpdateInfo foundUpdate = e.Result.HasValue ? e.Result.Value : null;

            if (nextUpdate != null && !nextUpdate.Equals(foundUpdate)){
                nextUpdate.DeleteInstaller();
            }

            nextUpdate = foundUpdate;
        }

        private void HandleInteractionEvent(EventHandler<UpdateInfo> eventHandler){
            UpdateInfo tmpInfo = nextUpdate;

            if (tmpInfo != null){
                sync.InvokeAsyncSafe(() => eventHandler?.Invoke(this, tmpInfo));
            }
        }

        // Bridge methods

        public void TriggerUpdateCheck(){
            updates.Check(false);
        }

        public void OnUpdateAccepted(){
            HandleInteractionEvent(UpdateAccepted);
        }

        public void OnUpdateDismissed(){
            HandleInteractionEvent(UpdateDismissed);

            nextUpdate?.DeleteInstaller();
            nextUpdate = null;
        }
    }
}