#if USE_ARTICY
// Copyright (c) Pixel Crushers. All rights reserved.
using System;
using System.IO;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace PixelCrushers.DialogueSystem.Articy
{
    /// 
    /// This class contains articy project conversion settings. It's used by ConverterPrefs.
    /// 
    public class ConversionSettings
    {
        private Dictionary dict = new Dictionary();
        public List list = new List();
        public enum DropdownOverrideMode { UseGlobalSetting, Int, TechnicalName, DisplayName }
        [Serializable]
        public class DropdownOverrideSetting
        {
            public string id = string.Empty;
            public DropdownOverrideMode mode = DropdownOverrideMode.UseGlobalSetting;
            public DropdownOverrideSetting() { }
            public DropdownOverrideSetting(string id, DropdownOverrideMode mode = DropdownOverrideMode.UseGlobalSetting)
            {
                this.id = id;
                this.mode = mode;
            }
        }
        private Dictionary dropdownOverrideDict = new Dictionary();
        public List dropdownOverrideList = new List();
        public static ConversionSettings FromXml(string xml)
        {
            ConversionSettings conversionSettings = null;
            if (string.IsNullOrEmpty(xml))
            {
                conversionSettings = new ConversionSettings();
            }
            else
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConversionSettings));
                conversionSettings = xmlSerializer.Deserialize(new StringReader(xml)) as ConversionSettings;
                if (conversionSettings != null) conversionSettings.AfterDeserialization();
            }
            return conversionSettings;
        }
        public string ToXml()
        {
            BeforeSerialization();
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConversionSettings));
            StringWriter writer = new StringWriter();
            xmlSerializer.Serialize(writer, this);
            return writer.ToString();
        }
        private void BeforeSerialization()
        {
            list.Clear();
            foreach (var entry in dict)
            {
                list.Add(entry.Value);
            }
            dropdownOverrideList.Clear();
            foreach (var entry in dropdownOverrideDict)
            {
                dropdownOverrideList.Add(entry.Value);
            }
        }
        private void AfterDeserialization()
        {
            dict.Clear();
            foreach (var element in list)
            {
                dict.Add(element.Id, element);
            }
            dropdownOverrideDict.Clear();
            foreach (var element in dropdownOverrideList)
            {
                dropdownOverrideDict.Add(element.id, element);
            }
        }
        public void Clear()
        {
            dict.Clear();
            list.Clear();
            dropdownOverrideDict.Clear();
            dropdownOverrideList.Clear();
        }
        public ConversionSetting GetConversionSetting(string Id)
        {
            if (string.IsNullOrEmpty(Id)) return null;
            if (!dict.ContainsKey(Id)) dict[Id] = new ConversionSetting(Id);
            return dict[Id];
        }
        public bool ConversionSettingExists(string Id)
        {
            return !string.IsNullOrEmpty(Id) && dict.ContainsKey(Id);
        }
        public DropdownOverrideSetting GetDropdownOverrideSetting(string id)
        {
            if (string.IsNullOrEmpty(id)) return null;
            if (!dropdownOverrideDict.ContainsKey(id))
            {
                var newEntry = new DropdownOverrideSetting(id);
                dropdownOverrideDict.Add(id, newEntry);
                dropdownOverrideList.Add(newEntry);
            }
            return dropdownOverrideDict[id];
        }
        public void AllDropdownOverrides(DropdownOverrideMode mode)
        {
            foreach (var setting in dropdownOverrideList)
            {
                setting.mode = mode;
            }
        }
    }
}
#endif