using System;
using System.Collections.Generic;
using System.Text;

#if !NET20
using System.Dynamic;
#endif

namespace Apewer
{

    /// <summary>文本字典模型。</summary>
    [Serializable]
    public class TextSet
#if !NET20
        : DynamicObject
#endif
    {

        [NonSerialized]
        private const string Null = "";

        private Dictionary<string, string> _origin;

        private bool _autotrim = false;

        private bool _locked = false;

        /// <summary>获取或设置字典内容。</summary>
        public string this[string key]
        {
            get { return Get(key); }
            set { Set(key, value); }
        }

        /// <summary>获取字典。</summary>
        internal Dictionary<string, string> Origin
        {
            get { return _origin; }
        }

        internal bool Locked { get { return _locked; } set { _locked = value; } }

        private void Constructor(bool autotrim, Dictionary<string, string> origin)
        {
            _origin = new Dictionary<string, string>();
            _autotrim = autotrim;

            if (origin != null)
            {
                foreach (var kvp in origin)
                {
                    var key = kvp.Key;
                    if (_autotrim && key.Length > 0) key = key.Trim();
                    if (_origin.ContainsKey(key)) continue;

                    var value = kvp.Value;
                    if (_autotrim && value.Length > 0) value = value.Trim();
                    _origin.Add(key, kvp.Value ?? "");
                }
            }
        }

        /// <summary>构造函数。</summary>
        public TextSet(bool autotrim = false)
        {
            Constructor(autotrim, null);
        }

        /// <summary>构造函数:从指定字典中导入。</summary>
        public TextSet(Dictionary<string, string> origin, bool autotrim)
        {
            Constructor(autotrim, origin);
        }

        /// <summary>构造函数:从指定实例中导入。</summary>
        public TextSet(TextSet origin, bool autotrim)
        {
            Constructor(autotrim, (origin == null) ? null : origin.Origin);
        }

        /// <summary>构造函数:从指定实例中导入。</summary>
        public TextSet(ObjectSet<string> origin, bool autotrim)
        {
            Constructor(autotrim, (origin == null) ? null : origin.Origin);
        }

        private string Get(string key)
        {
            var contains = false;
            return Get(key, ref contains);
        }

        private string Get(string key, ref bool contains)
        {
            var k = string.IsNullOrEmpty(key) ? "" : ((_autotrim) ? key.Trim() : key);
            var value = Null;
            lock (_origin)
            {
                contains = _origin.ContainsKey(k);
                if (contains) value = _origin[k];
            }
            return value ?? Null;
        }

        private bool Set(string key, string value)
        {
            if (_locked) return false;
            var k = string.IsNullOrEmpty(key) ? "" : ((_autotrim) ? key.Trim() : key);
            var v = string.IsNullOrEmpty(value) ? "" : ((_autotrim) ? value.Trim() : value);
            lock (_origin)
            {
                if (_origin.ContainsKey(k))
                {
                    _origin[k] = v ?? Null;
                }
                else
                {
                    _origin.Add(k, v);
                }
            }
            return true;
        }

#if !NET20

        /// <summary></summary>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            var contains = false;
            result = Get(binder.Name, ref contains);
            return contains;
        }

        /// <summary></summary>
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            return Set(binder.Name, value as string);
        }

#endif

    }

}