using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Aitex.Core.RT.Log;
using System.Xml;
using Aitex.Core.UI.ControlDataContext;
using System.Collections.ObjectModel;
namespace Aitex.Core.UI.Control
{
    /// 
    /// Interaction logic for MOSource.xaml
    /// 
    public partial class MOSource : UserControl
    {
        string _moConfig;
        public MOSource()
        {
            InitializeComponent();
        }
        public static readonly DependencyProperty MOSourceDataListProperty = DependencyProperty.Register(
                        "MOSourceDataList", typeof(ObservableCollection), typeof(MOSource),
                        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
        public ObservableCollection MOSourceDataList
        {
            get
            {
                return (ObservableCollection)this.GetValue(MOSourceDataListProperty);
            }
            set
            {
                this.SetValue(MOSourceDataListProperty, value);
            }
        }
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);
            UpdateMOLayout(_moConfig);
        }
        public void SetMOLayout(string moConfig)
        {
            _moConfig = moConfig;
        }
        void UpdateMOLayout(string moConfig)
        {
            double left = 0;
            double width = this.Width;
            double intervalWidth = 0;
            int splitBath = -1;
            double bathWidth = 0;
            int objIndex = 0;
            UserControl bathUc;
            double bathLeft = -1;
            int bathIntervalCount = 0;
            ObservableCollection obj = new ObservableCollection();
            if (rootCanvas.Children.Count > 0)
            {
                return;
            }
            if (string.IsNullOrEmpty(moConfig))
            {
                //LOG.Error("MO源配置文件为空");
                return;
            }
            //index, name, type
            List> items = new List>();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(moConfig);
            XmlNodeList lstNode = doc.SelectNodes("MOSourceConfig/MOSources/MOSourceItem");
            foreach (XmlNode node in lstNode)
            {
                try
                {
                    int index = int.Parse(node.Attributes["DisplayIndex"].Value) - 1;
                    string name = node.Attributes["Name"].Value;
                    string type = node.Attributes["Type"].Value;
                    int bathindex = int.Parse(node.Attributes["BathIndex"].Value) - 1;
                    if (!string.IsNullOrEmpty(name))
                    {
                        items.Add(new Tuple(index, name, type,bathindex));
                    }
                }
                catch (Exception ex)
                {
                    LOG.WriteExeption("MO源配置项错误," + node.Name, ex);
                }
            }
            items.Sort((p1, p2) => p1.Item1.CompareTo(p2.Item1));
            foreach (var item in items)
            {
                UserControl uc;
                switch (item.Item3)
                {
                    case "WithDilute": uc = new MODilute(); break;
                    case "WithPush": uc = new MOPush(); break;
                    case "General": uc = new MOGeneral();break;
                    default:
                        uc = new MOGeneral(); break;
                }
                obj.Add(new UILayoutDataItem());
                obj[objIndex].uc = uc;
                obj[objIndex].index = item.Item1;
                
                if (splitBath == -1 && item.Item4!=-1) //第一个Bath,如果bathIndex为-1,表示没有水槽
                {
                    bathWidth = uc.Width;
                    obj[objIndex].bathWidth = bathWidth;
                }
                else if ((item.Item4 == splitBath) && (item.Item4 != -1)) //一个Bath对应多个MO源
                {
                    bathWidth += uc.Width;
                    if (obj.Count>1)
                    obj[objIndex-1].bathWidth = 0;
                    obj[objIndex].bathWidth = bathWidth;
                }
                else if (item.Item4 != -1) //一个Bath只有一个对应的MO源
                {
                    bathWidth = uc.Width;
                    obj[objIndex].bathWidth = bathWidth;
                }
                else //Bath没有对应的MO源
                {
                    bathWidth = 0;
                    obj[objIndex].bathWidth = -1;
                }
                objIndex++;
                splitBath = item.Item4;
                width -= uc.Width;
            }
            intervalWidth = width / items.Count;
            foreach (var item in obj)
            {
                //Mo layout
                UserControl uc = item.uc as UserControl;
                Canvas.SetLeft(uc, left);
                uc.DataContext = MOSourceDataList[item.index];
                rootCanvas.Children.Add(uc);
                bathIntervalCount++;
                //bath layout
                if(item.bathWidth != -1)
                {
                    if(bathLeft == -1)
                    { bathLeft = left; }
                    
                    if(item.bathWidth>0)
                    {
                        bathUc = new Bath();
                        bathUc.Width = item.bathWidth + ((bathIntervalCount-1) * intervalWidth);
                        Canvas.SetLeft(bathUc, bathLeft);
                        Canvas.SetTop(bathUc, 220);
                        bathUc.SetBinding(Bath.DeviceDataProperty, new Binding("BathData") { Source = MOSourceDataList[item.index] });
                        //bathUc.DataContext = MOSourceDataList[item.index - 1];
                        rootCanvas.Children.Add(bathUc);
                        bathLeft = -1;
                        bathIntervalCount = 0;
                    }
                    
                }
                left += uc.Width + intervalWidth;
            }
        }
        public class UILayoutDataItem
        {
            public int index;
            public UserControl uc;
            public double bathWidth;
        }
    }
}