using System.Collections.Generic;
using System.ComponentModel;
using System;
using System.Linq;
using System.Text;

namespace TellerSystem.Contract.Internal
{
    /// <summary>
    /// TODO:该类型考虑进行抽象，成为公共类，用于字典类型数据的序列化传递
    /// 总线仅仅是其中的一种应用方式
    /// </summary>
    class DataBus
    {
        #region 基础存储方案
        /// <summary>
        /// 内置字典，存储介质。数据需要支持数据转换器
        /// </summary>
        private IDictionary<string, Tuple<Type, object>> _dict;
        /// <summary>
        /// 数据转换器集合
        /// </summary>
        private static IDictionary<Type, TypeConverter> _converters;
        public DataBus()
        {
            _dict = new Dictionary<string, Tuple<Type, object>>();
            if (_converters == null)
            {
                _converters = new Dictionary<Type, TypeConverter>();
                //注册TypeConverter集合
                /*****************************************
                 * 关于数据限定和转换
                 * 由于总线数据要求进行跨域传递，故保证支持序列化/反序列化
                 * 限定类型继承TypeConverter，务必实现其中的ConvertFromString,ConvertToString
                 * **************************************/
                _converters.Add(typeof(String), new StringConverter());
                _converters.Add(typeof(Int16), new Int16Converter());
                _converters.Add(typeof(Int32), new Int32Converter());
                _converters.Add(typeof(Int64), new Int64Converter());
                _converters.Add(typeof(Decimal), new DecimalConverter());
                _converters.Add(typeof(Boolean), new BooleanConverter());
            }
        }
        #endregion

        #region 基础操作集合
        /// <summary>
        /// 清理掉所有的数据项
        /// </summary>
        public void Clear()
        {
            _dict.Clear();
        }

        /// <summary>
        /// 获取总线数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public object GetDataItem(string key)
        {
            //查询数据
            if (string.IsNullOrEmpty(key) || !_dict.ContainsKey(key))
                return null;
            return _dict[key].Item2;
        }

        /// <summary>
        /// 设置总线数据
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetDataItem(string key, object value)
        {
            //参数检测
            if (string.IsNullOrEmpty(key) || value == null) return false;
            //拉取数据类型
            //TODO:暂定规则，必须保持类型一致，不考虑继承情况
            var item = _converters.FirstOrDefault(x => x.Key == value.GetType());
            //不支持的数据类型
            if (item.Key == null) throw new NotSupportedException(string.Format("DataBus：不支持的数据类型->[{0}]", value.GetType())); ;
            //存入数据
            if (_dict.ContainsKey(key))
                _dict[key] = new Tuple<Type, object>(item.Key, value);
            else
                _dict.Add(key, new Tuple<Type, object>(item.Key, value));
            return true;
        }

        /// <summary>
        /// 数据序列化
        /// </summary>
        /// <param name="dataBus"></param>
        /// <returns></returns>
        public static string Serialize(DataBus dataBus)
        {
            //TODO:伪代码，准备采用json序列化
            var serializeData = new StringBuilder();
            foreach (var item in dataBus._dict)
            {
                //item.Key
            }
            return serializeData.ToString();
        }

        /// <summary>
        /// 数据反序列化
        /// </summary>
        /// <param name="serializeData"></param>
        /// <returns></returns>
        public static DataBus Deserialize(string serializeData)
        {
            //TODO:伪代码，准备采用json序列化
            var dataBus = new DataBus();

            return dataBus;
        }

        #endregion
    }
}