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

using System.Xml;
using System.IO;

namespace TIAOpennessGenerator
{
    class Receipt
    {
        //string PathSource = @"D:\Sources\";
        //string PathObject = @"D:\";        

        //string PathSource = @"C:\Users\Student\Desktop\Object\Sources\";
        XmlDocument SourceFile = new XmlDocument();

        //public string PathSource;

        public static string PathSource;
        public static string PathObject;

        /// <summary>
        /// Načtení XML předpisu
        /// </summary>
        private void LoadXML()
        {
            //SourceFile.Load(PathSource + "SourceVerze1.xml");
            SourceFile.Load(PathSource + "Source.xml");
        }

        /// <summary>
        /// Získání všech bloků obsažených v XML předpisu
        /// </summary>
        /// <returns>Vrácen List typu Block, se všemi bloky z XML předpisu</returns>
        public List<Block> GetBlocks()
        {
            // vrátí název-přípona všech bloků
            List<Block> result = new List<Block>();
            Block block;

            LoadXML();
            
            XmlNodeList Block = SourceFile.SelectNodes("Document/PLC/Blocks/Block");

            foreach (XmlNode xn in Block)                                       //timer, counter,systemove
            {
                XmlNodeList Dependencies = xn.SelectNodes("Dependencies/Dependency");
                foreach (XmlNode Dependency in Dependencies)
                {
                    switch (Dependency.Attributes["Type"].Value)
                    {
                        case "Timer": block = new Block(Dependency.Attributes["Name"].Value, Dependency.Attributes["Type"].Value, BlockType.TIMER, Dependency); result.Add(block); break;
                        // couinter,db
                        case "Counter": block = new Block(Dependency.Attributes["Name"].Value, Dependency.Attributes["Type"].Value, BlockType.COUNTER, Dependency); result.Add(block); break;
                        case "DataBlock": block = new Block(Dependency.Attributes["Name"].Value, Dependency.Attributes["Type"].Value, BlockType.DATA_BLOCK, Dependency); result.Add(block); break;
                    }
                }

            }

            //Zvlášt pro přidání funkcí na konec listu, důležité při generování -> již musí být známy všechny proměnné,
            //tímto se toho docílí
            foreach (XmlNode xn in Block)                                       //function
            {
                switch (xn.Attributes["Type"].Value)
                {
                    case "Function": block = new Block(xn.Attributes["Name"].Value + xn.Attributes["Postfix"].Value, xn.Attributes["Name"].Value, BlockType.FUNCTION, xn); result.Add(block); break;
                }
            }
            return result;
        }


        /// <summary>
        /// Získání všech HMI screenů obsažených v XML předpisu
        /// </summary>
        /// <returns>Vrácen List typu HMI, se všemi screeny z XML předpisu</returns>
        public List<HMI> GetHMIs()
        {
            List<HMI> result = new List<HMI>();
            HMI hMI;

            LoadXML();

            XmlNodeList Layouts = SourceFile.SelectNodes("//Layouts/Screen");
            //XmlNode TagList = SourceFile.SelectSingleNode("//HMI/TagList");

            foreach (XmlNode Layout in Layouts)
            {

                hMI = new HMI(Layout, Layout.Attributes["Name"].Value + Layout.Attributes["Postfix"].Value);

                result.Add(hMI);
                    
            }
            
            return result;
        }

        /// <summary>
        /// Získání HMI tag tabulky se všemi HMI tagy obsažených v XML předpisu
        /// </summary>
        /// <returns>Vrácen XmlNode se všemi HMI tagyy z XML předpisu</returns>
        public XmlNode GetHMITagList()
        {
            LoadXML();

            XmlNode TagList = SourceFile.SelectSingleNode("//HMI/TagList");

            return TagList;
        }

        /// <summary>
        /// Získání PLC tagů obsažených v XML předpisu
        /// </summary>
        /// <returns>Vrácen XmlNodeList se všemi PLC tagyy z XML předpisu</returns>
        public XmlNode GetTagList()
        {
            LoadXML();
            XmlNode TagList = SourceFile.SelectSingleNode("Document/PLC/TagList");

            return TagList;
        }
        
    }
}
