using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;

using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Media;
using System.Globalization;
using System.Threading;
using MultiLayout;
using MultiLayout.UiModule;

namespace MultiLayout.MainEdit
{

    /// <summary>
    /// 编辑界面的图表区
    /// </summary>
    public class MeGraphTabItem : INotifyPropertyChanged
    {
        public TabItem mTabItem;

        /// <summary>
        /// 唯一标识码
        /// </summary>
        public int ID = 0;

        public string Title { get; set; } = "??";


        [PropertyChanged.DoNotCheckEquality]
        public int ColCnt { get; set; } = 1;


        [PropertyChanged.DoNotCheckEquality]
        public int RowCnt { get; set; } = 1;

        public List<bool> RowDefinitions { get; } = new List<bool>();

        public List<bool> ColumnDefinitions { get; } = new List<bool>();
   
        public List<MeGraphComponent> Components = new List<MeGraphComponent>();
        public event Action<MeGraphTabItem> RCChanged;

        public MeGraphTabItem()
        {
            RefreshRC();
        }
        bool refresh(List<bool> list, int cnt)
        {
            int n = cnt - list.Count();
            if (n == 0)
                return false;
            if (n > 0)
            {
                for (int i = 0; i < n; i++)
                {
                    list.Add(false);
                }
            }
            else
            {
                list.RemoveRange(cnt, -n);
            }
            return true;
        }
        void RefreshRC()
        {
            bool b1 = refresh(RowDefinitions, RowCnt);
            bool b2 = refresh(ColumnDefinitions, ColCnt);

            if (b1 || b2)
            {
                //把在范围外的控件缩小，或删除
                MakeComponentRectVaild();
                RCChanged?.Invoke(this);
            }
        }
        public void RefreshRC(int rowcnt, int colcnt)
        {
            RowCnt = rowcnt;
            ColCnt = colcnt;
            RefreshRC();
        }
        public bool IsComponentRectVaild(System.Drawing.Rectangle rect)
        {
            return IsComponentRectVaild(rect, null);
        }
        public bool IsComponentRectVaild(System.Drawing.Rectangle rect, MeGraphComponent component)
        {
            //判断超出范围
            if (!new System.Drawing.Rectangle(0, 0, ColCnt, RowCnt).Contains(rect))
            {
                return false;
            }
            //判断是否与其它控件有交集
            for (int i = 0; i < Components.Count(); i++)
            {
                if (Components[i] == component)
                    continue;
                if (rect.IntersectsWith(Components[i].Rect))
                    return false;
            }
            return true;
        }
        void MakeComponentRectVaild()
        {
            System.Drawing.Rectangle total = new System.Drawing.Rectangle(0, 0, ColCnt, RowCnt);
            for (int i = 0; i < Components.Count(); i++)
            {
                System.Drawing.Rectangle r = Components[i].Rect;
                if (r.IntersectsWith(total))
                {
                    r.Intersect(total);
                    Components[i].Rect = r;
                }
                else
                {
                    //删除
                    Components.RemoveAt(i);
                    i--;
                    continue;
                }
            }
        }

        /// <summary>
        /// 获取空的位置
        /// </summary>
        /// <returns></returns>
        public System.Drawing.Point GetFreeLocal()
        {
            //System.Drawing.Point
            //System.Drawing.Rectangle.
            for (int y = 0; y < RowCnt; y++)
            {
                for (int x = 0; x < ColCnt; x++)
                {
                    System.Drawing.Point p = new System.Drawing.Point(x, y);
                    bool isContains = false;
                    foreach (MeGraphComponent c in Components)
                    {
                        if (c.Rect.Contains(p))
                        {
                            isContains = true;
                            break;
                        }
                    }
                    if (!isContains)
                        return p;
                }

            }
            return new System.Drawing.Point(-1, -1);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="propertyname"></param>
        protected void NotifyPropertyChanged(string propertyname)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

    /// <summary>
    /// 编辑界面的图表区 对应 FlyLayout 的 GraphComponent 信息
    /// </summary>
    public class MeGraphComponent : MeFlyComponent
    {
        public System.Drawing.Rectangle Rect { get; set; }

        public MeGraphTabItem mItem;

    }
    /// <summary>
    /// 组件类型
    /// </summary>
    public class MeComponentType : INotifyPropertyChanged
    {
        /// <summary>
        /// 
        /// </summary>
        //public string ModuleName { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public IUiModule2 Module { get; set; }
        /// <summary>
        /// 
        /// </summary>

        public Brush Background { get; set; }

        /// <summary>
        /// 
        /// </summary>

        public string Header { get; set; }


        /// <summary>
        /// 只能添加一次
        /// </summary>
        public bool IsUnique { get; set; }


        /// <summary>
        /// 当只能添加一次，且当前已经添加了，isenable=false
        /// </summary>
        public bool IsEnable 
        {
            get {
                if (IsUnique && Count > 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

        /// <summary>
        /// 当前一共添加了多少控件
        /// </summary>
        public int Count { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;
    }

    /// <summary>
    /// 编辑界面的 组件 对应 FlyLayout 的 FlyComponent 信息
    /// </summary>
    public class MeFlyComponent : INotifyPropertyChanged
    {
        /// <summary>
        /// 唯一标识码
        /// </summary>
        public int ID = 0;


        /// <summary>
        /// 对应在grid中的button
        /// </summary>
        public Button mButton;

        public event PropertyChangedEventHandler PropertyChanged;

        public MeComponentType Type { get; set; }

        /// <summary>
        /// 服务容器名称
        /// </summary>
        public string ServiceContainerName { get; set; }
    }




}
