using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using TIS.Imaging;

namespace ISCamRecorder {
    class ICCFImport
    {
        private static void AddXmlAttribute(XmlDocument xmldoc, XmlNode xmlnode, string Name, string Value)
        {
            XmlAttribute newAttribute = xmldoc.CreateAttribute(Name);
            newAttribute.Value = Value;
            xmlnode.Attributes.Append(newAttribute);
        }

        public static string Import(string ICCFFileName)
        {
            return Import(ICCFFileName, "");
        }

        public static string Import(string ICCFFileName, string UniqueDevice)
        {
            bool deviceimported = false;

            XmlDocument xmldoc = new XmlDocument();
            XmlNodeList xmlnode;

            XmlDocument device_xml = new XmlDocument();
            XmlNode deviceroot = device_xml.CreateElement("device_state");

            string AllowedNames = "videoformat fps vcdproperties";

            xmldoc.Load(ICCFFileName);
            xmlnode = xmldoc.GetElementsByTagName("devices");

            AddXmlAttribute(device_xml, deviceroot, "libver", "3.4");
            AddXmlAttribute(device_xml, deviceroot, "filemajor", "1");
            AddXmlAttribute(device_xml, deviceroot, "fileminor", "0");

            device_xml.AppendChild(deviceroot);

            for (int i = 0; i < xmlnode.Count; i++)
            {
                for (int d = 0; d < xmlnode[i].ChildNodes.Count && !deviceimported; d++)
                {
                    if (xmlnode[i].ChildNodes[d].Name == "device")
                    {

                        if (CheckForDeviceName(UniqueDevice, xmlnode, i, d))
                        {
                            XmlNode newdevicenode = device_xml.CreateElement("device");
                            AddXmlAttribute(device_xml, newdevicenode, "name", xmlnode[i].ChildNodes[d].Attributes["name"].Value.ToString());
                            deviceroot.AppendChild(newdevicenode);

                            for (int o = 0; o < xmlnode[i].ChildNodes[d].ChildNodes.Count; o++)
                            {
                                if (xmlnode[i].ChildNodes[d].ChildNodes[o].Name == "unique")
                                {
                                    AddXmlAttribute(device_xml, newdevicenode, "unique_name", xmlnode[i].ChildNodes[d].ChildNodes[o].InnerText);
                                }
                                else
                                {
                                    if (AllowedNames.Contains(xmlnode[i].ChildNodes[d].ChildNodes[o].Name))
                                    {
                                        if (xmlnode[i].ChildNodes[d].ChildNodes[o].Name == "vcdproperties")
                                            newdevicenode.AppendChild(device_xml.ImportNode(xmlnode[i].ChildNodes[d].ChildNodes[o].ChildNodes[0], true));
                                        else
                                            newdevicenode.AppendChild(device_xml.ImportNode(xmlnode[i].ChildNodes[d].ChildNodes[o], true));
                                    }
                                }
                            }

                            deviceimported = true;
                        }
                    }
                }
            }
            if (deviceimported)
                return device_xml.InnerXml;

            return "";
        }


        private static bool CheckForDeviceName(string UniqueDevice, XmlNodeList xmlnode, int i, int d)
        {
            bool ImportDevice = true;

            if (UniqueDevice != "")
            {
                ImportDevice = false;
                for (int o = 0; o < xmlnode[i].ChildNodes[d].ChildNodes.Count; o++)
                {
                    if (xmlnode[i].ChildNodes[d].ChildNodes[o].Name == "unique")
                    {
                        if (UniqueDevice == xmlnode[i].ChildNodes[d].ChildNodes[o].InnerText)
                        {
                            ImportDevice = true;
                        }
                    }
                }
            }

            return ImportDevice;
        }

        public static List<string> GetDeviceList(string ICCFFileName)
        {
            List<string> Devlist = new List<string>();

            XmlDocument xmldoc = new XmlDocument();
            XmlNodeList xmlnode;

            xmldoc.Load(ICCFFileName);
            xmlnode = xmldoc.GetElementsByTagName("devices");

            for (int i = 0; i < xmlnode.Count; i++)
            {
                for (int d = 0; d < xmlnode[i].ChildNodes.Count; d++)
                {
                    if (xmlnode[i].ChildNodes[d].Name == "device")
                    {
                        for (int o = 0; o < xmlnode[i].ChildNodes[d].ChildNodes.Count; o++)
                        {
                            if (xmlnode[i].ChildNodes[d].ChildNodes[o].Name == "unique")
                            {
                                Devlist.Add(xmlnode[i].ChildNodes[d].ChildNodes[o].InnerText);
                            }
                        }
                    }
                }
            }
            return Devlist;
        }

    }
}
