using FLY.UI.Module;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace ThickTcpUiInWindow
{
    public class FLYLayoutManager
    {
        /// <summary>
        /// lmodule 本地与第3方模块
        /// </summary>
        public FLY.UI.Module.LoadUIModule lmodule = new FLY.UI.Module.LoadUIModule();
        /// <summary>
        /// 本地模块
        /// </summary>
        public Dictionary<string, UIModuleInfo> myUIModules = new Dictionary<string, UIModuleInfo>();

        public UIModule.FLYLayout mLayout;
        protected TabControl tabControl;
        protected StackPanel stackpanel_dynarea;
        protected StackPanel stackpanel_menu;

        /// <summary>
        /// 
        /// </summary>
        public FLYLayoutManager()
        {

        }

        /// <summary>
        /// 加载模块
        /// </summary>
        public void LoadModule()
        {
            lmodule.Load("main_module");


            foreach (KeyValuePair<string, UIModuleInfo> kv in myUIModules)
            {
                lmodule.UIModules.Add(kv.Key, kv.Value);
            }

            //把不支持的模块删除
            mLayout.DynAreaItems.RemoveAll(c => !lmodule.UIModules.ContainsKey(c.Module));
            foreach (var tabitem in mLayout.Items)
            {
                tabitem.Graphs.RemoveAll(c => !lmodule.UIModules.ContainsKey(c.Module));
            }




            InitializeComponent_bulkgraph();
            InitializeComponent_dynarea();
            InitializeComponent_menu();
            //加载尺寸，位置
            int SH = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
            int SW = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

            if ((mLayout.Left < 0) || (mLayout.Left >= SW))
                mLayout.Left = 0;

            if ((mLayout.Top < 0) || (mLayout.Top >= SH))
                mLayout.Top = 0;

            if ((mLayout.Width > SW))
                mLayout.Width = SW;

            if ((mLayout.Height > SH))
                mLayout.Height = SH;

            Application.Current.MainWindow.Left = mLayout.Left;
            Application.Current.MainWindow.Top = mLayout.Top;
            Application.Current.MainWindow.Width = mLayout.Width;
            Application.Current.MainWindow.Height = mLayout.Height;
            Application.Current.MainWindow.WindowState = mLayout.WindowState;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="tabControl"></param>
        /// <param name="stackpanel_dynarea"></param>
        /// <param name="stackpanel_menu"></param>
        /// <param name="layout"></param>
        public void Init(TabControl tabControl, StackPanel stackpanel_dynarea, StackPanel stackpanel_menu,
            UIModule.FLYLayout layout)
        {

            this.mLayout = layout;


            this.tabControl = tabControl;
            this.stackpanel_dynarea = stackpanel_dynarea;
            this.stackpanel_menu = stackpanel_menu;
        }

        void InitializeComponent_bulkgraph()
        {
            foreach (UIModule.GraphTabItem item in mLayout.Items)
            {
                //grid
                Grid grid = new Grid();
                for (int i = 0; i < item.ColumnCount; i++)
                {
                    ColumnDefinition cd = new ColumnDefinition();
                    if (item.ColumnDefinitions.Count() > i)
                    {
                        if (item.ColumnDefinitions[i])
                            cd.Width = GridLength.Auto;
                    }
                    grid.ColumnDefinitions.Add(cd);
                }
                for (int i = 0; i < item.RowCount; i++)
                {
                    RowDefinition rd = new RowDefinition();
                    if (item.RowDefinitions.Count() > i)
                    {
                        if (item.RowDefinitions[i])
                            rd.Height = GridLength.Auto;
                    }
                    grid.RowDefinitions.Add(rd);
                }

                //graph
                foreach (UIModule.GraphComponent gp in item.Graphs)
                {
                    if (!lmodule.UIModules.Keys.Contains(gp.Module))
                        continue;
                    UIModuleInfo info = lmodule.UIModules[gp.Module];
                    
                    Frame frame = new Frame();
                    frame.SetValue(Frame.MarginProperty, new Thickness(2));

                    frame.Content = info.UIModule.GetComponent(gp.ID);
                    info.BuildCnt++;

                    frame.DataContext = gp;
                    frame.SetBinding(Grid.ColumnProperty, new Binding("Column"));
                    frame.SetBinding(Grid.RowProperty, new Binding("Row"));
                    frame.SetBinding(Grid.ColumnSpanProperty, new Binding("ColumnSpan"));
                    frame.SetBinding(Grid.RowSpanProperty, new Binding("RowSpan"));
                    grid.Children.Add(frame);
                }
                TabItem tabitem = new TabItem()
                {
                    Header = item.Header
                };
                tabitem.Content = grid;
                this.tabControl.Items.Add(tabitem);
            }
        }

        void InitializeComponent_dynarea()
        {
            foreach (UIModule.DynAreaComponent item in mLayout.DynAreaItems)
            {
                if (!lmodule.UIModules.Keys.Contains(item.Module))
                    continue;
                UIModuleInfo info = lmodule.UIModules[item.Module];
                
                Frame frame = new Frame();
                frame.Content = info.UIModule.GetComponent(item.ID);
                info.BuildCnt++;

                stackpanel_dynarea.Children.Add(frame);
            }
        }

        void InitializeComponent_menu()
        {
            foreach (var kv in lmodule.UIModuleGroups)
            {
                //统计模块组内的模块被创建的个数
                int c = (from u in lmodule.UIModules
                         where kv.Value.ModuleNames.Contains(u.Key) && u.Value.BuildCnt > 0
                         select u).Count();
                if (c > 0)
                {
                    //找到模块组内 menu 模块，添加到 mLayout.MenuItems
                    mLayout.MenuItems.AddRange (
                        from u in lmodule.UIModules
                        where kv.Value.ModuleNames.Contains(u.Key) && u.Value.Param.IsMenuCompnonent
                        select new UIModule.MenuComponent() { Module = u.Key });
                }
            }
            
            foreach (UIModule.MenuComponent item in mLayout.MenuItems)
            {
                if (!lmodule.UIModules.Keys.Contains(item.Module))
                    continue;
                FLY.UI.Module.IUIModule pm = lmodule.UIModules[item.Module].UIModule;
                Frame frame = new Frame();
                frame.Content = pm.GetComponent(item.ID);
                stackpanel_menu.Children.Add(frame);
            }
        }

        /// <summary>
        /// 通知全部模块，告诉它们现在正在使用的控件，保存多余的参数就删除。
        /// </summary>
        public void MatchParam()
        {
            List<UIModule.FLYComponent> components = new List<UIModule.FLYComponent>();

            foreach (UIModule.GraphTabItem item in mLayout.Items)
                components.AddRange(item.Graphs);
            
            components.AddRange(mLayout.DynAreaItems);
            
            Dictionary<string, List<int>> modules = new Dictionary<string, List<int>>();
            foreach (UIModule.FLYComponent c in components)
            {
                if (modules.ContainsKey(c.Module))
                     modules[c.Module].Add(c.ID);
                else
                    modules.Add(c.Module, new List<int>(new int[] { c.ID }));
            }

            foreach (var m in modules)
            {
                
                FLY.UI.Module.IUIModule pm = lmodule.UIModules[m.Key].UIModule;
                pm.MatchParam(m.Value.ToArray());
                
            }
        }
    }



}
