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

using ICSharpCode.Core;
using ICSharpCode.Data.Core.Interfaces;
using ICSharpCode.Data.Core.DatabaseObjects;

using Mesnac.Basic;
using Mesnac.Gui.Edit.Global;
using Mesnac.Gui.Edit.Common;
using Mesnac.Gui.Edit.ViewContent;
using Mesnac.Gui.Edit.Pad;

namespace Mesnac.Gui.Edit.Dialog
{
    public partial class FrmNewDataSource : Form
    {
        private string _dataSourceName;
        private DataSourceItem _dataSourceItem = null;
        private string caption = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_Caption"));
        private string msg = String.Empty;
        

        public FrmNewDataSource()
        {
            InitializeComponent();
            this.InitUIMethod();
            this.InitMethod();
        }
        public FrmNewDataSource(string dataSourceName)
        {
            this._dataSourceName = dataSourceName;
            InitializeComponent();
            this.InitUIMethod();
            this.InitMethod2();
        }

        /// <summary>
        /// 初始化界面元素
        /// </summary>
        public void InitUIMethod()
        {
            this.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Text"));       //数据源向导
            this.label1.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label1"));  //数据源名称
            this.label2.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label2"));  //数据库驱动
            this.label3.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label3"));  //服务器
            this.label4.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label4"));  //用户名
            this.label5.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label5"));  //密码
            this.label6.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label6"));  //数据库
            this.label7.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_label7"));   //连接超时
            this.btnTestConnect.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_btnTestConnect"));  //测试连接
            this.btnOk.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnOK"));
            this.btnCancel.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnCancel"));
        }

        /// <summary>
        /// 新建时,初始化的方法
        /// </summary>
        public void InitMethod()
        {
            //获取默认数据源名称
            string dataSourceName = DataSourceFactory.Instance.GetNextDataSourceName();
            this.txtDataSourceName.Text = dataSourceName;
            //加载数据驱动类型
            this.cmbDataDrivers.DataSource = DatabaseDriver.DatabaseDrivers;
        }
        /// <summary>
        /// 修改时,初始化的方法
        /// </summary>
        public void InitMethod2()
        {
            this._dataSourceItem = DataSourceFactory.Instance.DataSources[this._dataSourceName];
            this.txtDataSourceName.Text = this._dataSourceName;
            this.txtDataSourceName.ReadOnly = true;
            //加载数据驱动类型
            this.cmbDataDrivers.DataSource = DatabaseDriver.DatabaseDrivers;
            if (this._dataSourceItem != null)
            {
                foreach (IDatabaseDriver driver in this.cmbDataDrivers.Items)
                {
                    if (driver.Name == this._dataSourceItem.Driver)
                    {
                        this.cmbDataDrivers.SelectedItem = driver;
                        break;
                    }
                }

                this.txtServer.Text = this._dataSourceItem.Server;
                this.txtUserName.Text = this._dataSourceItem.UserName;
                this.txtPassword.Text = this._dataSourceItem.Password;
                this.cmbDataBase.Text = this._dataSourceItem.Database;
                this.txtConnectionTimeout.Text = this._dataSourceItem.ConnectionTimeout.ToString();
            }
        }

        /// <summary>
        /// 验证窗体条件
        /// </summary>
        /// <returns>验证成功返回true,否则返回false</returns>
        private bool ValidateForm()
        {
            if (String.IsNullOrEmpty(this.txtDataSourceName.Text))
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg1"));   //请输入数据源名称!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txtDataSourceName.Focus();
                return false;
            }
            if (this.cmbDataDrivers.SelectedIndex == -1)
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg2"));   //请选择数据源类型!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.cmbDataDrivers.Focus();
                return false;
            }
            if (String.IsNullOrEmpty(this.txtServer.Text))
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg3"));   //请输入服务器!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txtServer.Focus();
                return false;
            }
            if (String.IsNullOrEmpty(this.txtUserName.Text))
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg4"));   //请输入用户名!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txtUserName.Focus();
                return false;
            }
            //if (String.IsNullOrEmpty(this.txtPassword.Text))
            //{
            //    this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg5"));   //请输入密码!
            //    MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
            //    this.txtPassword.Focus();
            //    return false;
            //}
            if (String.IsNullOrEmpty(this.txtConnectionTimeout.Text))
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg12"));   //请输入连接超时时间,单位(秒)!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txtConnectionTimeout.Focus();
                return false;
            }
            ///判断连接超时是否为数字
            bool flag = true;
            string strConnectionTimeOut = this.txtConnectionTimeout.Text.Trim();
            foreach (char c in strConnectionTimeOut)
            {
                if (!Char.IsDigit(c))
                {
                    flag = false;
                    break;
                }
            }
            if (flag == false)
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg13"));   //连接超时必须为整数,单位(秒)!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.txtConnectionTimeout.Focus();
                return false;
            }
            if (String.IsNullOrEmpty(this._dataSourceName))
            {
                if (DataSourceFactory.Instance.IsExists(this.txtDataSourceName.Text))
                {
                    this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg6"));   //数据源已存在,请更改数据源名称!
                    MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.txtDataSourceName.Focus();
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 测试连接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTestConnect_Click(object sender, EventArgs e)
        {
            //验证
            if (!this.ValidateForm())
            {
                return;
            }
            try
            {
                IDatabaseDriver driver = this.cmbDataDrivers.SelectedItem as IDatabaseDriver;
                if (driver != null)
                {

                    IDatasource datasource = driver.CreateNewIDatasource( this.txtServer.Text , this.txtUserName.Text , this.txtPassword.Text );
                    driver.PopulateDatabases(datasource);
                    if (datasource.Databases != null)
                    {
                        this.cmbDataBase.DataSource = datasource.Databases;

                        if (!String.IsNullOrEmpty(this._dataSourceName))
                        {
                            foreach (IDatabase db in this.cmbDataBase.Items)
                            {
                                if (db.ToString() == this._dataSourceItem.Database)
                                {
                                    this.cmbDataBase.SelectedItem = db;
                                    break;
                                }
                            }
                        }
                        this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg7"));   //连接测试成功,请选择数据库创建数据源!
                        MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg8"));   //连接测试失败,请检查网络连接状况!
                        MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg9"));   //连接测试失败,原因:缺少数据驱动!
                    MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg10"));   //连接测试失败,原因:{0}!
                this.msg = String.Format(this.msg, ex.Message);
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            //验证
            if (!this.ValidateForm())
            {
                return;
            }
            if (this.cmbDataBase.SelectedIndex == -1)
            {
                this.msg = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmNewDataSource_Msg11"));   //请选择数据库!
                MessageBox.Show(this.msg, this.caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.cmbDataBase.Focus();
                return;
            }

            DataSourceItem dataSourceItem = new DataSourceItem();
            dataSourceItem.Name = this.txtDataSourceName.Text.Trim();
            IDatabaseDriver driver = this.cmbDataDrivers.SelectedItem as IDatabaseDriver;
            dataSourceItem.Driver = driver.Name;
            dataSourceItem.DriverAssembly = driver.GetType().Assembly.FullName;
            dataSourceItem.DriverClass = driver.GetType().FullName;
            dataSourceItem.Server = this.txtServer.Text.Trim();
            dataSourceItem.UserName = this.txtUserName.Text.Trim();
            dataSourceItem.Password = this.txtPassword.Text.Trim();
            IDatabase database = this.cmbDataBase.SelectedItem as IDatabase;
            dataSourceItem.Database = database.Name;
            int intConnectionTimeout = 5;
            int.TryParse(this.txtConnectionTimeout.Text, out intConnectionTimeout);
            dataSourceItem.ConnectionTimeout = intConnectionTimeout;
            dataSourceItem.DataSourceClass = database.GetType().FullName;

            if (!String.IsNullOrEmpty(this._dataSourceName))
            {
                //修改
                DataSourceFactory.Instance.Modify(dataSourceItem.Name, dataSourceItem);
            }
            else
            {
                //添加
                DataSourceFactory.Instance.Add(dataSourceItem.Name, dataSourceItem);
            }

            DisplayUtil<ProjectWindow>.SaveProjectDataSource();     //保存至文件

            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
        }
    }
}