/*!
 * \file DataSerializerXML.cs
 * \author Léana Besson
 */
using System.Runtime.Serialization;
using System.Xml;
using Model;

/*!
 * \namespace Persistance
 */
namespace Persistance
{
    /*!
     * \class DataSerializerXML
     * \brief Contains all the information and functions needed to serialize information in XML format
     */
    public class DataSerializerXML
    {
        /*!
         * \fn Serializer(string path, Theque theque)
         * \brief Serializes theque information in the file theque.xml
         * \param path string - Path of the file in which the file is to be saved 
         * \param theque Theque - Theque to be serialized
         */
        public static void Serializer(string path, Theque theque)
        {
            Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
            string xmlFile = "theque.xml";

            var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });

            XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
            using (TextWriter tw = File.CreateText(xmlFile))
            {
                using (XmlWriter writer = XmlWriter.Create(tw, settings))
                {
                    serializer.WriteObject(writer, theque);
                }
            }
        }

        /*!
         * \fn Deserializer(string path)
         * \brief Deserializes the information contained in theque.xml file if it exists, otherwise it retrieves the information from the stub
         * \param path string - Path of the file in which the file is to be saved 
         * \return Theque - Theque with recovered data 
         */
        public static Theque Deserializer(string path)
        {
            Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
            string xmlFile = "theque.xml";

            var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });

            Theque theque = new Theque();
            if(File.Exists(xmlFile))
            {
                using (Stream stream = File.OpenRead(xmlFile))
                {
                    Theque? thequeOpt = serializer.ReadObject(stream) as Theque;
                    if (thequeOpt != null)
                        theque = thequeOpt;
                    else
                        Console.WriteLine("Theque est null");
                }
            }
            else
            {
                theque = Stub.LoadTheque();
            }
            return theque;
        }
    }
}