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

/*!
 * \namespace Persistance
 */
namespace Persistance
{
    /*!
     * \class DataSerializerBinary
     * \brief Contains all the information and functions needed to serialize information in binary format
     */
    public class DataSerializerBinary
    {
        /*!
         * \fn Serializer(string path, Theque theque)
         * \brief Serializes theque information in the file theque.txt
         * \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 txtFile = "theque.txt";

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

            using (FileStream stream = File.Create(txtFile))
            {
                using (XmlDictionaryWriter xmlDicoWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
                {
                    serializer.WriteObject(xmlDicoWriter, theque);
                }
            }
        }

        /*!
         * \fn Deserializer(string path)
         * \brief Deserializes the information contained in theque.txt 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 txtFile = "theque.txt";

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

            Theque? theque = new Theque();
            if (File.Exists(txtFile))
            {
                using (FileStream stream = File.OpenRead(txtFile))
                {
                    using (XmlDictionaryReader xmlDicoReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
                    {
                        Theque? thequeOpt = serializer.ReadObject(xmlDicoReader) as Theque;
                        if (thequeOpt != null)
                            theque = thequeOpt;
                        else
                            Console.WriteLine("Theque est null"); 
                    }
                }
            }
            else
            {
                theque = Stub.LoadTheque();
            }
            return theque;
        }
    }
}
