using System;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using TweetDuck.Plugins;
using TweetDuck.Plugins.Controls;

namespace TweetDuck.Core.Other{
    sealed partial class FormPlugins : Form, FormManager.IAppDialog{
        private readonly PluginManager pluginManager;
        
        public FormPlugins(){
            InitializeComponent();

            Text = Program.BrandName+" Plugins";
        }

        public FormPlugins(PluginManager pluginManager) : this(){
            this.pluginManager = pluginManager;

            if (!Program.UserConfig.PluginsWindowSize.IsEmpty){
                Size targetSize = Program.UserConfig.PluginsWindowSize;
                Size = new Size(Math.Max(MinimumSize.Width, targetSize.Width), Math.Max(MinimumSize.Height, targetSize.Height));
            }
            
            Shown += (sender, args) => {
                ReloadPluginList();
            };

            FormClosed += (sender, args) => {
                Program.UserConfig.PluginsWindowSize = Size;
                Program.UserConfig.Save();
            };

            ResizeEnd += (sender, args) => {
                timerLayout.Start();
            };
        }

        private int GetPluginOrderIndex(Plugin plugin){
            return !plugin.CanRun ? 0 : pluginManager.Config.IsEnabled(plugin) ? 1 : 2;
        }

        private void ReloadPluginList(){
            flowLayoutPlugins.Controls.Clear();
            flowLayoutPlugins.SuspendLayout();

            foreach(Plugin plugin in pluginManager.Plugins.OrderBy(GetPluginOrderIndex).ThenBy(plugin => plugin.Name)){
                flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager, plugin));

                flowLayoutPlugins.Controls.Add(new Panel{
                    BackColor = Color.DimGray,
                    Margin = new Padding(0),
                    Size = new Size(1, 1)
                });
            }

            flowLayoutPlugins.ResumeLayout(true);
            
            timerLayout_Tick(null, EventArgs.Empty);
            timerLayout.Start();
        }

        private void timerLayout_Tick(object sender, EventArgs e){
            timerLayout.Stop();
            
            // stupid WinForms scrollbars and panels
            Padding = new Padding(Padding.Left, Padding.Top, Padding.Right+1, Padding.Bottom+1);
            Padding = new Padding(Padding.Left, Padding.Top, Padding.Right-1, Padding.Bottom-1);
        }

        public void flowLayoutPlugins_Resize(object sender, EventArgs e){
            Control lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
            
            if (lastPlugin == null){
                return;
            }

            bool showScrollBar = lastPlugin.Location.Y+lastPlugin.Height+1 >= flowLayoutPlugins.Height;
            int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
            
            flowLayoutPlugins.AutoScroll = showScrollBar;
            flowLayoutPlugins.VerticalScroll.Visible = showScrollBar;

            foreach(Control control in flowLayoutPlugins.Controls){
                control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
            }
            
            flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1].Visible = !showScrollBar;
            flowLayoutPlugins.Focus();
        }

        private void btnOpenFolder_Click(object sender, EventArgs e){
            using(Process.Start("explorer.exe", '"'+pluginManager.PathCustomPlugins+'"')){}
        }

        private void btnReload_Click(object sender, EventArgs e){
            if (FormMessage.Warning("Reloading Plugins", "This will also reload the browser window. Do you want to proceed?", FormMessage.Yes, FormMessage.No)){
                pluginManager.Reload();
                ReloadPluginList();
            }
        }

        private void btnClose_Click(object sender, EventArgs e){
            Close();
        }
    }
}