﻿/// <summary>
/// A weakly typed representation of a JSON object using a dictionary implementation
/// </summary>
/// <typeparam name="T">The CLR type of the values of the properties</typeparam>

namespace DataJS.Tests
{
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;

    [Serializable]
    [KnownType(typeof(JsonObject))]
    [KnownType(typeof(JsonObject[]))]
    [KnownType(typeof(JsDate))]
    [KnownType(typeof(List<object>))]
    public class JsonObject : ISerializable, IEnumerable<KeyValuePair<string, object>>
    {
        Dictionary<string, object> dictionary = new Dictionary<string, object>();

        public void Remove(string key)
        {
            dictionary.Remove(key);
        }

        public object this[string key]
        {
            get
            {
                return this.dictionary[key];
            }
            set
            {
                this.dictionary[key] = value;
            }
        }

        public bool ContainsKey(string key)
        {
            return this.dictionary.ContainsKey(key);
        }

        public static JsonObject Merge(JsonObject first, JsonObject second)
        {
            if (first == null)
            {
                return second;
            }

            if (second != null)
            {
                JsonObject merged = new JsonObject();
                merged.dictionary = new Dictionary<string, object>(first.dictionary);
                foreach (var pair in second.dictionary)
                {
                    merged.dictionary[pair.Key] = pair.Value;
                }
                return merged;
            }
            return first;
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            this.dictionary.ToList().ForEach(pair => info.AddValue(pair.Key, pair.Value));
        }

        public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
        {
            return this.dictionary.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.dictionary.GetEnumerator();
        }
    }
}