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

namespace TweetDuck.Core.Other{
    sealed partial class FormPlugins : Form{
        private readonly PluginManager pluginManager;
        private readonly TabButton tabBtnOfficial, tabBtnCustom;
        private readonly PluginListFlowLayout flowLayoutPlugins;

        private PluginGroup? selectedGroup;

        public FormPlugins(){
            InitializeComponent();

            Text = Program.BrandName+" Plugins";
        }

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

            this.flowLayoutPlugins = new PluginListFlowLayout();
            this.flowLayoutPlugins.Resize += flowLayoutPlugins_Resize;

            this.tabPanelPlugins.SetupTabPanel(90);
            this.tabPanelPlugins.ReplaceContent(flowLayoutPlugins);

            this.tabBtnOfficial = tabPanelPlugins.AddButton("", () => SelectGroup(PluginGroup.Official));
            this.tabBtnCustom = tabPanelPlugins.AddButton("", () => SelectGroup(PluginGroup.Custom));

            this.pluginManager_Reloaded(pluginManager, null);

            Shown += (sender, args) => {
                Program.UserConfig.PluginsWindow.Restore(this, false);
                this.tabPanelPlugins.SelectTab(tabBtnOfficial);
            };

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

            Disposed += (sender, args) => this.pluginManager.Reloaded -= pluginManager_Reloaded;
        }

        private void SelectGroup(PluginGroup group){
            if (selectedGroup.HasValue && selectedGroup == group)return;

            selectedGroup = group;
            
            ReloadPluginTab();
        }

        public void ReloadPluginTab(){
            if (!selectedGroup.HasValue)return;

            flowLayoutPlugins.SuspendLayout();
            flowLayoutPlugins.Controls.Clear();

            Plugin[] plugins = pluginManager.GetPluginsByGroup(selectedGroup.Value).OrderBy(plugin => !plugin.CanRun ? 0 : pluginManager.Config.IsEnabled(plugin) ? 1 : 2).ThenBy(plugin => plugin.Name).ToArray();

            for(int index = 0; index < plugins.Length; index++){
                flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager, plugins[index]));

                if (index < plugins.Length-1){
                    flowLayoutPlugins.Controls.Add(new Panel{
                        BackColor = Color.DimGray,
                        Size = new Size(1, 1)
                    });
                }
            }

            flowLayoutPlugins.ResumeLayout(true);
            flowLayoutPlugins_Resize(flowLayoutPlugins, new EventArgs());
        }

        private void pluginManager_Reloaded(object sender, PluginErrorEventArgs e){
            tabBtnOfficial.Text = "Official: "+pluginManager.CountPluginByGroup(PluginGroup.Official);
            tabBtnCustom.Text = "Custom: "+pluginManager.CountPluginByGroup(PluginGroup.Custom);
        }

        private void flowLayoutPlugins_Resize(object sender, EventArgs e){
            if (flowLayoutPlugins.Controls.Count == 0){
                return;
            }

            Control lastControl = flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1];
            bool showScrollBar = lastControl.Location.Y+lastControl.Height >= 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.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 (MessageBox.Show("This will also reload the browser window. Do you want to proceed?", "Reloading Plugins", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) == DialogResult.Yes){
                pluginManager.Reload();
                ReloadPluginTab();
            }
        }

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