using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Mesnac.Basic.Service
{
    /// <summary>
    /// UndoRedo服务类
    /// </summary>
    public class UndoRedoService
    {
        #region 字段定义

        private static Dictionary<Control, EventHandlerProcessor> _dicControlEventHandler = new Dictionary<Control, EventHandlerProcessor>();

        #endregion

        #region 属性定义

        /// <summary>
        /// Undo操作栈
        /// </summary>
        public static Stack<ICommand> UndoStack = new Stack<ICommand>();

        /// <summary>
        /// Redo操作栈
        /// </summary>
        public static Stack<ICommand> RedoStack = new Stack<ICommand>();

        /// <summary>
        /// 控件事件处理绑定集合
        /// </summary>
        public static Dictionary<Control, EventHandlerProcessor> DicControlEventHandler
        {
            get
            {
                return _dicControlEventHandler;
            }
        }

        #endregion

        #region Undo Redo服务初始化

        /// <summary>
        /// Undo Redo服务初始化
        /// </summary>
        /// <param name="controls">要注册UndoRedo服务的控件集合</param>
        public static void Init(List<Control> controls)
        {
            Clear();

            EventHandlerProcessor ehp = null;

            foreach (Control ctl in controls)
            {
                if (ctl is TextBox)
                {
                    ehp = new EventHandlerProcessor((ctl as TextBox).Text);
                    _dicControlEventHandler.Add(ctl, ehp);
                    (ctl as TextBox).LostFocus -= ehp.TextBox_LostFocus;
                    (ctl as TextBox).LostFocus += ehp.TextBox_LostFocus;
                }
                if (ctl is CheckBox)
                {
                    ehp = new EventHandlerProcessor((ctl as CheckBox).Checked);
                    _dicControlEventHandler.Add(ctl, ehp);
                    (ctl as CheckBox).CheckedChanged -= ehp.CheckBox_CheckedChanged;
                    (ctl as CheckBox).CheckedChanged += ehp.CheckBox_CheckedChanged;
                }
                if (ctl is ComboBox)
                {
                    ehp = new EventHandlerProcessor((ctl as ComboBox).SelectedItem);
                    _dicControlEventHandler.Add(ctl, ehp);
                    (ctl as ComboBox).SelectedIndexChanged -= ehp.ComboBox_SelectedIndexChanged;
                    (ctl as ComboBox).SelectedIndexChanged += ehp.ComboBox_SelectedIndexChanged;
                }
                if (ctl is DateTimePicker)
                {
                    ehp = new EventHandlerProcessor((ctl as DateTimePicker).Value);
                    _dicControlEventHandler.Add(ctl, ehp);
                    (ctl as DateTimePicker).ValueChanged -= ehp.DateTimePicker_ValueChanged;
                    (ctl as DateTimePicker).ValueChanged += ehp.DateTimePicker_ValueChanged;
                }
                if (ctl is DataGridView)
                {
                    DataTable dtOld = Mesnac.Basic.DataProcessor.GetDataTableFromGridView((ctl as DataGridView));
                    ehp = new EventHandlerProcessor(dtOld);
                    _dicControlEventHandler.Add(ctl, ehp);
                    (ctl as DataGridView).CellValueChanged -= ehp.DataGridView_CellValueChanged;
                    (ctl as DataGridView).CellValueChanged += ehp.DataGridView_CellValueChanged;
                }
            }
        }

        #endregion

        #region 清除操作栈

        /// <summary>
        /// 清除操作栈
        /// </summary>
        public static void Clear()
        {
            foreach(Control ctl in _dicControlEventHandler.Keys)
            {
                if (ctl is TextBox)
                {
                    (ctl as TextBox).LostFocus -= _dicControlEventHandler[ctl].TextBox_LostFocus;
                }
                if (ctl is CheckBox)
                {
                    (ctl as CheckBox).CheckedChanged -= _dicControlEventHandler[ctl].CheckBox_CheckedChanged;
                }
                if (ctl is ComboBox)
                {
                    (ctl as ComboBox).SelectedIndexChanged -= _dicControlEventHandler[ctl].ComboBox_SelectedIndexChanged;
                }
                if (ctl is DateTimePicker)
                {
                    (ctl as DateTimePicker).ValueChanged -= _dicControlEventHandler[ctl].DateTimePicker_ValueChanged;
                }
                if (ctl is DataGridView)
                {
                    (ctl as DataGridView).CellValueChanged -= _dicControlEventHandler[ctl].DataGridView_CellValueChanged;
                }
            }
            
            _dicControlEventHandler.Clear();

            UndoStack.Clear();
            RedoStack.Clear();
        }

        #endregion
    }
}