using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace SiaSun.LMS.WCFHost
{
    public partial class CONFIG : Form
    {
        string strAppName = null;
        DataTable tableApp = null;
        SiaSun.LMS.Common.XmlFiles xmlDoc = null;

        SiaSun.LMS.Common.XmlFiles xmlDocMap = null;

        /// <summary>
        /// 构造函数
        /// </summary>
        public CONFIG()
        {
            InitializeComponent();
        }

        //加载窗体
        private void CONFIG_Load(object sender, EventArgs e)
        {
            //加载App数据
            LoadAppData();
        }

        #region    ------App

        /// <summary>
        /// 加载数据
        /// </summary>
        private void LoadAppData()
        {
            //初始化表集合
            if (tableApp == null)
            {
                tableApp = new DataTable();
                tableApp.Columns.Add("key");
                tableApp.Columns.Add("value");
                //设置唯一约束
                tableApp.Columns[0].Unique = true;
            }

            //清除数据
            tableApp.Rows.Clear();

            //加载数据
            try
            {
                strAppName = Application.ExecutablePath.Substring(0, (Application.ExecutablePath.Length)) + ".config";
                xmlDoc = new SiaSun.LMS.Common.XmlFiles(strAppName);
                if (xmlDoc != null)
                {
                    //找到所有的添加节点
                    foreach (System.Xml.XmlNode node in xmlDoc.SelectNodes("/configuration/appSettings/add"))
                    {
                        tableApp.Rows.Add(node.Attributes[0].InnerText, node.Attributes[1].InnerText);
                    }
                }

                //接受更改
                tableApp.AcceptChanges();

                //设置数据源
                this.gridAPP.DataSource = tableApp;
            }
            catch (Exception ex)
            {
                MessageBox.Show( ex.Message);
            }
        }

        /// <summary>
        /// 添加配置信息
        /// </summary>
        private void AddConfig(XmlNode nodeParent, DataRow rowApp)
        {
            //判断值类型
            if (rowApp.IsNull(rowApp.Table.Columns[0]) || string.IsNullOrEmpty(rowApp[0].ToString()))
            {
                MessageBox.Show(string.Format("key名称不允许空!"));
                return;
            }

            XmlNode nodeAdd = nodeParent.AppendChild(xmlDoc.CreateNode(XmlNodeType.Element, "add", nodeParent.NamespaceURI));
            nodeAdd.Attributes.Append(xmlDoc.CreateAttribute("key")).InnerText = rowApp[0].ToString();
            nodeAdd.Attributes.Append(xmlDoc.CreateAttribute("value")).InnerText = rowApp[1].ToString();
        }

        /// <summary>
        /// 更新配置信息
        /// </summary>
        private void UpdateConfig(XmlNode nodeParent, DataRow rowApp)
        {
            //判断值类型
            if (rowApp.IsNull(rowApp.Table.Columns[0]) || string.IsNullOrEmpty(rowApp[0].ToString()))
            {
                MessageBox.Show( string.Format("key名称不允许空!"));
                return;
            }
            XmlNode nodeFind = nodeParent.SelectSingleNode("//add[@key='" + rowApp[0].ToString() + "']");
            if (nodeFind != null)
            {
                nodeFind.Attributes[1].InnerText = rowApp[1].ToString();
            }
        }

        /// <summary>
        /// 删除配置信息
        /// </summary>
        private void DeleteConfig(XmlNode nodeParent, DataRow rowApp)
        {
            XmlNode nodeFind = nodeParent.SelectSingleNode("//add[@key='" + rowApp[0, DataRowVersion.Original].ToString() + "']");
            if (nodeFind != null)
            {
                nodeParent.RemoveChild(nodeFind);
            }
        }

        //保存APP信息
        private void btnAppSave_Click(object sender, EventArgs e)
        {
            if (xmlDoc == null)
                return;

            //提交保存
            this.gridAPP.EndEdit();
            this.BindingContext[this.gridAPP.DataSource, this.gridAPP.DataMember].EndCurrentEdit();

            if (MessageBox.Show("确定保存App配置信息?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
            {
                DataTable tableChanages = tableApp.GetChanges();
                if (tableApp != null)
                {
                    //获得上级节点
                    XmlNode nodeTop = xmlDoc.FindNode("configuration/appSettings");
                    if (nodeTop != null)
                    {
                        foreach (DataRow rowApp in tableChanages.Rows)
                        {
                            //判断状态
                            if (rowApp.RowState == DataRowState.Added)         //添加
                            {
                                AddConfig(nodeTop, rowApp);
                            }
                            else if (rowApp.RowState == DataRowState.Modified)  //保存更新
                            {
                                UpdateConfig(nodeTop, rowApp);
                            }
                            else if (rowApp.RowState == DataRowState.Deleted)    //删除
                            {
                                DeleteConfig(nodeTop, rowApp);
                            }
                        }

                        //保存更新
                        xmlDoc.Save(strAppName);
                    }
                }
            }
        }

        //刷新重新加载
        private void btnAppUpdate_Click(object sender, EventArgs e)
        {
            LoadAppData();
        }

        #endregion 

        #region        ------Map

        /// <summary>
        /// 更改SqlMap选项
        /// </summary>
        private void cmbSqlMap_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.cmbSqlMap.SelectedItem == null)
                return;

            //加载SqlMap文件
            this.LoadMapData(this.cmbSqlMap.Text);
        }

        /// <summary>
        /// 加载Map数据
        /// </summary>
        private void LoadMapData(string MapFileName)
        {
            xmlDocMap = new SiaSun.LMS.Common.XmlFiles(MapFileName);
            if (xmlDocMap != null)
            {
                XmlNodeList listNode = xmlDocMap.ChildNodes;
                if (listNode.Cast<XmlNode>().Count(r => r.Name == "sqlMapConfig") > 0)
                {
                    XmlNode nodeRoot = listNode.Cast<XmlNode>().First(r => r.Name == "sqlMapConfig");
                    listNode = nodeRoot.ChildNodes;
                    if (listNode.Cast<XmlNode>().Count(r => r.Name == "database") > 0)
                    {
                        //数据访问提供程序类型
                        XmlNode nodeDataBase = listNode.Cast<XmlNode>().First(r => r.Name == "database");
                        listNode = nodeDataBase.ChildNodes;
                        if (listNode.Cast<XmlNode>().Count(r => r.Name == "provider") > 0)
                        {
                            //数据访问提供程序
                            XmlNode nodeProvider = listNode.Cast<XmlNode>().First(r => r.Name == "provider");
                            if (nodeProvider != null)
                            {
                                cmbProvider.Text = nodeProvider.Attributes["name"].InnerText;
                            }
                        }

                        //连接字符串
                        if (listNode.Cast<XmlNode>().Count(r => r.Name == "dataSource") > 0)
                        {
                            XmlNode nodeSource = listNode.Cast<XmlNode>().First(r => r.Name == "dataSource");
                            if (nodeSource != null)
                            {
                                txtConnStr.Text = nodeSource.Attributes["connectionString"].InnerText;
                            }
                        }
                    }
                }
            }
        }

        //保存Map数据信息
        private void btnMapSave_Click(object sender, EventArgs e)
        {
            if (xmlDocMap == null)
                return;

            if (MessageBox.Show("确定保存Map配置信息?","系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.Cancel)
                return;

            XmlNodeList listNode = xmlDocMap.ChildNodes;
            if (listNode.Cast<XmlNode>().Count(r => r.Name == "sqlMapConfig") > 0)
            {
                XmlNode nodeRoot = listNode.Cast<XmlNode>().First(r => r.Name == "sqlMapConfig");
                listNode = nodeRoot.ChildNodes;
                if (listNode.Cast<XmlNode>().Count(r => r.Name == "database") > 0)
                {
                    //数据访问提供程序类型
                    XmlNode nodeDataBase = listNode.Cast<XmlNode>().First(r => r.Name == "database");
                    listNode = nodeDataBase.ChildNodes;
                    if (listNode.Cast<XmlNode>().Count(r => r.Name == "provider") > 0)
                    {
                        //数据访问提供程序
                        XmlNode nodeProvider = listNode.Cast<XmlNode>().First(r => r.Name == "provider");
                        if (nodeProvider != null)
                        {
                            nodeProvider.Attributes["name"].InnerText = cmbProvider.Text;
                        }
                    }

                    //连接字符串
                    if (listNode.Cast<XmlNode>().Count(r => r.Name == "dataSource") > 0)
                    {
                        XmlNode nodeSource = listNode.Cast<XmlNode>().First(r => r.Name == "dataSource");
                        if (nodeSource != null)
                        {
                            nodeSource.Attributes["connectionString"].InnerText = txtConnStr.Text;
                        }
                    }

                    //保存
                    this.xmlDocMap.Save(this.cmbSqlMap.Text);
                }
            }
        }

        //刷新重新加载
        private void btnMapUpdate_Click(object sender, EventArgs e)
        {
            if (this.cmbSqlMap.SelectedItem == null)
                return;
            LoadMapData(this.cmbSqlMap.Text);
        }

        #endregion
    }
}