﻿using NLog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using static BaSys40.Utils.Settings.FileWatcher;

namespace BaSys40.Utils.Settings
{
    [Serializable]
    public abstract class Settings<T> : ISettings where T : ISettings, new()
    {
        private FileWatcher fileWatcher;

        public string FilePath { get; set; }

        public const string SettingsAppendix = ".xml";
        public const string MiscellaneousConfig = "Miscellaneous";

        private static Logger logger = LogManager.GetCurrentClassLogger();
        public static string FileName => typeof(T).Name + SettingsAppendix;

        public Settings()
        {
            ServerConfig = new ServerConfiguration();
            ClientConfig = new ClientConfiguration();
            PathConfig = new PathConfiguration();
            ProxyConfig = new ProxyConfiguration();
            Miscellaneous = new Dictionary<string, string>();
        }

        public virtual void ConfigureSettingsWatcher(string settingsFilePath, FileChanged settingsFileChangedHandler)
        {
            fileWatcher = new FileWatcher(settingsFilePath, settingsFileChangedHandler);
        }
    
        public static T LoadSettings(string filePath)
        {
            if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
                return default(T);

            T settings = new T();

            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                using (var reader = XmlReader.Create(filePath))
                {
                    if (serializer.CanDeserialize(reader))
                    {
                        settings = (T)serializer.Deserialize(reader);
                    }
                }

                var miscElement = XElement.Load(filePath).Element(MiscellaneousConfig);
                if (miscElement != null)
                {
                    settings.Miscellaneous = miscElement.Elements().Where(e => !e.HasElements).ToDictionary(e => e.Name.LocalName, e => e.Value);
                }

                settings.FilePath = filePath;
                
                return settings;
            }
            catch (Exception e)
            {
                logger.Error(e, "Could not load " + filePath);
                return default(T);
            }
        }
        public enum ServiceType
        {
            None,
            Server,
            Client,
            Both
        }

        [XmlElement]
        public ServiceType OperationMode { get; set; }
        [XmlElement(IsNullable = true)]
        public ServerConfiguration ServerConfig { get; set; }
        [XmlElement(IsNullable = true)]
        public ClientConfiguration ClientConfig { get; set; }
        [XmlElement(IsNullable = true)]
        public PathConfiguration PathConfig { get; set; }
        [XmlElement(IsNullable = true)]
        public ProxyConfiguration ProxyConfig { get; set; }

        [XmlIgnore]
        public Dictionary<string, string> Miscellaneous { get; set; }


        [Serializable]
        public class ServerConfiguration
        {
            [XmlElement]
            public string ServerId { get; set; }
            [XmlElement]
            public string Endpoint { get; set; }
        }

        [Serializable]
        public class ClientConfiguration
        {
            [XmlElement]
            public string ClientId { get; set; }
            [XmlElement]
            public string Endpoint { get; set; }         
        }

        [Serializable]
        public class PathConfiguration
        {
            [XmlElement]
            public string Host { get; set; }
            [XmlElement]
            public string BasePath { get; set; }
            [XmlElement]
            public string ServicePath { get; set; }
            [XmlElement]
            public string AggregatePath { get; set; }
            [XmlElement]
            public string EntityPath { get; set; }
            [XmlElement]
            public string EntityId { get; set; }
        }

        [Serializable]
        public class ProxyConfiguration
        {
            [XmlElement]
            public bool? UseProxy { get; set; }
            [XmlElement]
            public string ProxyAddress { get; set; }
            [XmlElement]
            public string Domain { get; set; }
            [XmlElement]
            public string UserName { get; set; }
            [XmlElement]
            public string Password { get; set; }
        }
    }
}
