using KlassenBIB;
using SchnittstelleImporter.XML2006;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Schema;

namespace SchnittstelleImporter
{
    /// <summary>
    /// 
    /// </summary>
    public class I2006XML : IImportedObjekte
    {
        string xmlFile;
        string projektnummer;
        Dictionary<string, string> materialReferenz = new Dictionary<string, string>();
        /// <summary>
        /// Angabe zur XML datei
        /// </summary>
        public string XMLFile
        {
            get
            {
                return xmlFile;
            }
            set
            {
                xmlFile = value;
            }
        }
        /// <summary>
        /// Angabe zur Projektnummer
        /// </summary>
        public string Projektnummer
        {
            get
            {
                return projektnummer;
            }
            set
            {
                projektnummer = value;
            }

        }
        /// <summary>
        /// 
        /// </summary>
        public I2006XML()
        {
            LoadMaterialien();
        }
        private void LoadMaterialien()
        {
            materialReferenz.Add("AZ", "AsbestZement");
            materialReferenz.Add("B", "Beton");
            materialReferenz.Add("BS", "BetonSegmente");

            /*materialReferenz.Add("CNS
            materialReferenz.Add("EIS
            materialReferenz.Add("FZ
            */
            materialReferenz.Add("GFK", "GFK");
            materialReferenz.Add("GG", "Grauguss");
            /*
            materialReferenz.Add("GGG
            materialReferenz.Add("KST
            materialReferenz.Add("MA
            materialReferenz.Add("OB
            materialReferenz.Add("P
            materialReferenz.Add("PC
            materialReferenz.Add("PCC
            */
            materialReferenz.Add("PE", "PE");
            materialReferenz.Add("PEHD", "PEHD");
            /*
            materialReferenz.Add("PH
            materialReferenz.Add("PHB
            */
            materialReferenz.Add("PP", "Polypropolen");
            materialReferenz.Add("PVC", "Polyvinylchlorid");
            materialReferenz.Add("PVCU", "Polyvinylchlorid hart");
            /*materialReferenz.Add("SFB
            materialReferenz.Add("SPB
            */
            materialReferenz.Add("SB", "Stahlbeton");
            //materialReferenz.Add("ST
            materialReferenz.Add("STZ", "Steinzeug");
            /*materialReferenz.Add("SZB
            materialReferenz.Add("W
            materialReferenz.Add("ZG
            materialReferenz.Add("MIX
            materialReferenz.Add("BOD
            materialReferenz.Add("RAS
            materialReferenz.Add("PFL
            */
        }

        private string getRohrmaterial(string kennung)
        {
            string result;
            if (!materialReferenz.TryGetValue(kennung, out result))
                result = kennung;

            return result;
        }

        private static void LoadRefListe()
        {
            //XmlSchema s = XmlSchema.Read(XmlReader.Create(@"XML2006\SchemaDateien\0610-referenzlisten.xsd"), null);
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(@"XML2006\SchemaDateien\0610-referenzlisten.xsd");

            XmlNodeReader nodeReader = new XmlNodeReader(xmlDocument);
            while(nodeReader.Read())
            {
                Trace.WriteLine(nodeReader.Name);
                Trace.WriteLine(nodeReader.GetAttribute("name"));
            }
            /*
            int x = xmlDocument.ChildNodes.Count;
            var y = xmlDocument.ChildNodes[7];

            for(int i = 0; i < y.ChildNodes.Count; i++)
            {
                var d = y.ChildNodes[i];
                var e = d["MaterialType"];
                Trace.WriteLine(e);
            }*/

        }

        private static void ValidationCallback(object sender, ValidationEventArgs e)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Inspektionsobjekt> GetInspektionsobjekte()
        {
            List<Inspektionsobjekt> result = new List<Inspektionsobjekt>();
            List<InspizierteAbwassertechnischeAnlage> anlagen = XMLParser.GetList(XMLFile);
            foreach(InspizierteAbwassertechnischeAnlage src in anlagen)
            {
                Inspektionsobjekt inspektionsobjekt = new Inspektionsobjekt();
                InspektionskuerzelnCollection inspektionskuerzelns = new InspektionskuerzelnCollection();

                inspektionsobjekt.Projektnummer = projektnummer;
                inspektionsobjekt.Objektbezeichnung = src.Objektbezeichnung;
                inspektionsobjekt.OrtName = src.Lage.Ortname!= null? src.Lage.Ortname : "";
                inspektionsobjekt.StrasseName = src.Lage.Strassename != null ? src.Lage.Strassename : "noname";
                inspektionsobjekt.RohrMaterial = src.OptischeInspektion.Rohrleitung.Grunddaten.Material != null ? getRohrmaterial(src.OptischeInspektion.Rohrleitung.Grunddaten.Material) : "Unbekannt";
                inspektionsobjekt.Kanalrohrweite = src.OptischeInspektion.Rohrleitung.Grunddaten.Profilhoehe != 0 ? (uint)src.OptischeInspektion.Rohrleitung.Grunddaten.Profilhoehe : (uint)src.OptischeInspektion.Rohrleitung.Grunddaten.Profilbreite;
                inspektionsobjekt.Haltungslaenge = Convert.ToDouble(src.OptischeInspektion.Rohrleitung.Inspektionslaenge);
                inspektionsobjekt.VonPunkt = src.OptischeInspektion.Rohrleitung.Grunddaten.KnotenZulauf;
                inspektionsobjekt.BisPunkt = src.OptischeInspektion.Rohrleitung.Grunddaten.KnotenAblauf;
                inspektionsobjekt.Inspektionsrichtung = src.OptischeInspektion.Rohrleitung.Inspektionsrichtung;


                foreach(RZustand zustand in src.OptischeInspektion.Rohrleitung.Zustaende)
                {
                    Inspektionskuerzeln inspektionskuerzeln = new Inspektionskuerzeln();
                    inspektionskuerzeln.Station = zustand.Station;
                    inspektionskuerzeln.Hauptkode = zustand.Inspektionskode;
                    inspektionskuerzeln.Charakterisierung1 = zustand.Charakterisierung1;
                    inspektionskuerzeln.Charakterisierung2 = zustand.Charakterisierung2;
                    inspektionskuerzeln.ImVerbindung = zustand.Verbindung;
                    inspektionskuerzeln.LageAmUmfangStart = Convert.ToUInt32(zustand.PositionVon);
                    inspektionskuerzeln.LageAmUmfangEnde = Convert.ToUInt32(zustand.PositionBis);

                    Quantifizierung quant1 = zustand.Quantifizierung1;
                    Quantifizierung quant2 = zustand.Quantifizierung2;

                    inspektionskuerzeln.Quantifizierung1 = Convert.ToUInt32(quant1.Numerisch);
                    inspektionskuerzeln.Quantifizierung2 = Convert.ToUInt32(quant2.Numerisch);

                    inspektionskuerzelns.Add(inspektionskuerzeln);
                }

                inspektionsobjekt.Schadenskuerzeln = inspektionskuerzelns;
                result.Add(inspektionsobjekt);
            }
            return result;
        }
    }
}
