using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Text.RegularExpressions;

namespace EduNetworkBuilder
{
    [Serializable]
    public class LanguageString
    {

        public string text="";
        public string language="en";
        public string tag_type;
        private LanguageString() { }

        public LanguageString(string lang, string msg, string tag)
        {
            text = msg;
            language = lang;
            tag_type = tag;
        }
        public LanguageString Clone()
        {
            LanguageString newitem = new LanguageString();
            newitem.text = text;
            newitem.language = language;
            newitem.tag_type = tag_type;
            return newitem;
        }

        public LanguageString(XmlNode theNode, string tag)
        {
            XmlNodeType myNodetype = theNode.NodeType;
            if (myNodetype == XmlNodeType.Element)
            {
                if(Regex.IsMatch(theNode.Name.ToLower(),"^[a-z][a-z]_" + tag))
                {
                    //We have a language, and then a message
                    text = theNode.InnerText;
                    language = Regex.Replace(theNode.Name.ToLower(), "_" + tag, "");
                }
                else
                {
                    //It is just a message.  Use the default language.
                    language = "en";
                    text = theNode.InnerText;
                }
            }
            tag_type = tag;
        }

        public bool Equals(LanguageString compareWith)
        {
            if (text != compareWith.text) return false;
            if (tag_type != compareWith.tag_type) return false;
            if (language != compareWith.language) return false;
            return true;
        }

        public void Save(XmlWriter writer)
        {
            writer.WriteElementString(language+"_" + tag_type, text);
        }
    }

    [Serializable]
    public class LanguageStrings
    {
        List<LanguageString> TheStrings = new List<LanguageString>();
        string tag = "";

        /// <summary>
        /// Make a language string list of type: "message", "title"
        /// </summary>
        /// <param name="type">Should be of type "message" or "title"</param>
        public LanguageStrings(string type)
        {
            tag = type;
        }
        private LanguageStrings() { }
        public LanguageStrings(LanguageStrings ToCopy)
        {
            LanguageStrings.Clone(ToCopy, this);
        }

        public static void Clone(LanguageStrings source, LanguageStrings dest)
        {
            dest.tag = source.tag;
            dest.TheStrings.Clear();
            foreach(LanguageString ls in source.TheStrings)
            {
                dest.TheStrings.Add(ls.Clone());
            }
        }
        public LanguageStrings Clone()
        {
            LanguageStrings newitem = new LanguageStrings();
            LanguageStrings.Clone(this, newitem);
            return newitem;
        }

        public void Add(XmlNode theNode)
        {
            LanguageString oneString = new LanguageString(theNode, tag);
            //remove duplicates
            for (int i = TheStrings.Count - 1; i >= 0; i--)
            {
                if (TheStrings[i].language == oneString.language)
                {
                    TheStrings.RemoveAt(i);
                }
            }
            TheStrings.Add(oneString);
        }
        public void Add(string Text)
        {
            NBSettings oursettings = NB.GetSettings();
            LanguageString oneString = new LanguageString(oursettings.ChosenLanguage,Text,tag);
            //remove duplicates
            for (int i = TheStrings.Count - 1; i >= 0; i--)
            {
                if (TheStrings[i].language == oneString.language)
                {
                    TheStrings.RemoveAt(i);
                }
            }
            TheStrings.Add(oneString);
        }

        public void Save(XmlWriter writer)
        {
            foreach(LanguageString LS in TheStrings)
            {
                LS.Save(writer);
            }
        }

        public string GetText(string language)
        {
            //Find the matching language
            foreach(LanguageString LS in TheStrings)
            {
                if(LS.language == language)
                {
                    return LS.text;
                }
            }

            //Return the english version if one exists
            if(language != "en")
            {
                return GetText("en");
            }

            //return the first language (if the puzzle is only in french, use that.) 
            if (TheStrings.Count > 0)
                return TheStrings[0].text;

            //If there is no language, return a blank message
            return "";
        }

        public void ChangeText(string language, string NewText)
        {
            bool done = false;
            //Find the matching language
            foreach (LanguageString LS in TheStrings)
            {
                if (LS.language == language)
                {
                    LS.text = NewText;
                    done = true;
                }
            }

            if(!done)
            {
                LanguageString oneString = new LanguageString(language, NewText, tag);
                TheStrings.Add(oneString);
            }
        }

        public string GetText()
        {
            NBSettings oursettings = NB.GetSettings();
            return GetText(oursettings.ChosenLanguage);
        }
    }
}