using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace Aitex.UI.RecipeEditor.Core
{
        /// <summary>
        /// Endby condition define
        /// </summary>
        [Serializable]
        [DataContract]
        public enum EndByCondition
        {
            /// <summary>
            /// Reactor temperature greate than
            /// </summary>
            [EnumMember]
            PmTempGt,

            /// <summary>
            /// Reactor temperature less than
            /// </summary>
            [EnumMember]
            PmTempLt,

            /// <summary>
            /// Reactor A zone temperature greate than
            /// </summary>
            [EnumMember]
            AZoneTempGt,

            /// <summary>
            /// Reactor A zone temperature less than
            /// </summary> 
            [EnumMember]
            AZoneTempLt,

            /// <summary>
            /// Reactor B zone temperature greate than
            /// </summary> 
            [EnumMember]
            BZoneTempGt,

            /// <summary>
            /// Reactor B zone temperature less than
            /// </summary> 
            [EnumMember]
            BZoneTempLt,

            /// <summary>
            /// Reactor C zone temperature greate than
            /// </summary> 
            [EnumMember]
            CZoneTempGt,

            /// <summary>
            /// Reactor C zone temperature less than
            /// </summary> 
            [EnumMember]
            CZoneTempLt,

            /// <summary>
            /// Reactor D zone temperature greate than
            /// </summary> 
            [EnumMember]
            DZoneTempGt,

            /// <summary>
            /// Reactor D zone temperature less than
            /// </summary> 
            [EnumMember]
            DZoneTempLt,

            /// <summary>
            /// Reactor pressure greate than
            /// </summary> 
            [EnumMember]
            PmPresGt,

            /// <summary>
            /// Reactorpressure less than
            /// </summary> 
            [EnumMember]
            PmPresLt,

            /// <summary>
            /// TC value great than
            /// </summary>
            [EnumMember]
            TcGt,

            /// <summary>
            /// TC value less than
            /// </summary>
            [EnumMember]
            TcLt,

            /// <summary>
            /// spindle speed great than
            /// </summary>
            [EnumMember]
            RpmGt,

            /// <summary>
            /// spindle speed less than
            /// </summary>
            [EnumMember]
            RpmLt,
    }

        public class CustomXmlSerializer
        {
            static public void Serialize<T>(T t, string fileName)
            {
                using (FileStream fileWriter = new FileStream(fileName, FileMode.Create))
                using (XmlWriter writer = XmlTextWriter.Create(fileWriter))
                {
                    XmlSerializer serializer = new XmlSerializer(t.GetType());

                    serializer.Serialize(writer, t);
                    writer.Flush();
                }
            }
            static public string Serialize<T>(T t)
            {
                StringBuilder buffer = new StringBuilder();
                using (StringWriter writer = new StringWriter(buffer))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    serializer.Serialize(writer, t);
                }

                return buffer.ToString();
            }

            static public T Deserialize<T>(string xmlString)
            {
                if (string.IsNullOrWhiteSpace(xmlString))
                    throw new ArgumentNullException("xmlString");

                using (StringReader reader = new StringReader(xmlString))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return (T)serializer.Deserialize(reader);
                }
            }

            static public T Deserialize<T>(Stream streamReader)
            {
                if (streamReader == null)
                    throw new ArgumentNullException("streamReader");
                if (streamReader.Length <= 0)
                    throw new EndOfStreamException("The stream is blank");

                using (XmlReader reader = XmlTextReader.Create(streamReader))
                {
                    XmlSerializer deserializer = new XmlSerializer(typeof(T));
                    return (T)deserializer.Deserialize(reader);
                }
            }

            static public T Deserialize<T>(FileInfo fi)
            {
                if (fi == null)
                    throw new ArgumentNullException("fi");
                if (!fi.Exists)
                    throw new FileNotFoundException(fi.FullName);

                using (FileStream fileReader = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read))
                    return Deserialize<T>(fileReader);
            }
        }
}