using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace ShaderForge {
	[XmlRoot( "dictionary" )]
	public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable {
		#region IXmlSerializable Members
		public System.Xml.Schema.XmlSchema GetSchema() {
			return null;
		}

		public void ReadXml( System.Xml.XmlReader reader ) {
			XmlSerializer keySerializer = new XmlSerializer( typeof( TKey ) );
			XmlSerializer valueSerializer = new XmlSerializer( typeof( TValue ) );

			bool wasEmpty = reader.IsEmptyElement;
			reader.Read();

			if( wasEmpty )
				return;

			while( reader.NodeType != System.Xml.XmlNodeType.EndElement ) {
				reader.ReadStartElement( "item" );

				reader.ReadStartElement( "key" );
				TKey key = (TKey)keySerializer.Deserialize( reader );
				reader.ReadEndElement();

				reader.ReadStartElement( "value" );
				TValue value = (TValue)valueSerializer.Deserialize( reader );
				reader.ReadEndElement();

				this.Add( key, value );

				reader.ReadEndElement();
				reader.MoveToContent();
			}
			reader.ReadEndElement();
		}

		public void WriteXml( System.Xml.XmlWriter writer ) {
			XmlSerializer keySerializer = new XmlSerializer( typeof( TKey ) );
			XmlSerializer valueSerializer = new XmlSerializer( typeof( TValue ) );

			foreach( TKey key in this.Keys ) {
				writer.WriteStartElement( "item" );

				writer.WriteStartElement( "key" );
				keySerializer.Serialize( writer, key );
				writer.WriteEndElement();

				writer.WriteStartElement( "value" );
				TValue value = this[key];
				valueSerializer.Serialize( writer, value );
				writer.WriteEndElement();

				writer.WriteEndElement();
			}
		}
		#endregion
	}
}