using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
using System.Drawing;
using System;
using System.Text;
using System.Collections.Generic;
using TweetDick.Core.Handling;

namespace TweetDick.Core{
    partial class FormNotification : Form{
        private readonly FormBrowser owner;
        private readonly ChromiumWebBrowser browser;

        private readonly Queue<TweetNotification> tweetQueue = new Queue<TweetNotification>(4);

        public FormNotification(FormBrowser owner){
            InitializeComponent();

            this.owner = owner;

            browser = new ChromiumWebBrowser(""){ MenuHandler = new MenuHandlerEmpty() };
            Controls.Add(browser);
        }

        public void ShowNotification(TweetNotification notification){
            Screen screen = Screen.FromControl(owner);
            Location = new Point(screen.WorkingArea.X+screen.WorkingArea.Width-16-Width,screen.WorkingArea.Y+16);

            tweetQueue.Enqueue(notification);

            if (!timer.Enabled){
                LoadNextNotification();
            }
        }

        public void HideNotification(){
            browser.Load("about:blank");
            Location = new Point(32000,32000);
        }

        private void LoadNextNotification(){
            TweetNotification tweet = tweetQueue.Dequeue();

            browser.Load("about:blank");
            browser.LoadHtml(tweet.GenerateHtml(),"http://tweetdeck.twitter.com/");

            timer.Stop();
            timer.Interval = 5000;
            timer.Start();
        }

        private void timer_Tick(object sender, EventArgs e){
            if (tweetQueue.Count > 0){
                LoadNextNotification();
            }
            else{
                HideNotification();
            }
        }

        private void FormNotification_FormClosing(object sender, FormClosingEventArgs e){
            if (e.CloseReason == CloseReason.UserClosing){
                HideNotification();
                tweetQueue.Clear();
                e.Cancel = true;
            }
        }

        private class MenuHandlerEmpty : IContextMenuHandler{
            public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
                model.Clear();
            }

            public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){
                return false;
            }

            public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){}

            public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback){
                return false;
            }
        }
    }
}