using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;


namespace Finance
{
    class Program
    {
        static void Main(string[] args)
        {
            Adresse adresse = new Adresse("Müller", "Hugo", "Zum Irrtum 12", "37121", "Velbert-Neviges");
            Auftrag auftrag = new Auftrag(adresse, "2005-08-02", 4.55m);
            RechnungsPosten posten1 = new RechnungsPosten("Asus MyPal 610", "PDA", 270.65m, 1);
            RechnungsPosten posten2 = new RechnungsPosten("Rey Color A4 100", 8.99m, 5);
            auftrag.BestelltePosten[0] = posten1;
            auftrag.BestelltePosten[1] = posten2;
            auftrag.ExportToXML("purchaseorder.xml");
            Auftrag auftrag2 = auftrag.ImportFromXML("purchaseorder.xml");
        }
    }

    [XmlRoot("PurchaseOrder")]
    public class Auftrag
    {
        [XmlElement("ShipTo")]
        public Adresse LieferAdresse;
        [XmlElement("OrderDate")]
        public string LieferDatum;
        [XmlArray("Items")]
        [XmlArrayItem("OrderedItem")]
        public RechnungsPosten[] BestelltePosten;
        [XmlElement("SubTotal")]
        public decimal NettoKosten
        {
            get
            {
                decimal nettoKosten = 0;
                foreach (RechnungsPosten posten in BestelltePosten)
                    nettoKosten += posten.StueckGesamtPreis;
                return nettoKosten;
            }
            set { }
        }
        [XmlElement("ShipCost")]
        public decimal VersandKosten;
        [XmlElement("TotalCost")]
        public decimal Gesamtkosten
        {
            get { return NettoKosten + VersandKosten; }
            set { }
        }
        public Auftrag() { }
        public Auftrag(Adresse lieferAdresse, string lieferDatum, decimal versandKosten)
        {
            LieferAdresse = lieferAdresse;
            LieferDatum = lieferDatum;
            VersandKosten = versandKosten;
            BestelltePosten = new RechnungsPosten[2];
        }

        public void ExportToXML(string fileName)
        {
            XmlSerializer mySerializer = new XmlSerializer(typeof(Auftrag));
            StreamWriter myWriter = new StreamWriter(fileName);
            mySerializer.Serialize(myWriter, this);
            myWriter.Close();
        }

        public Auftrag ImportFromXML(string fileName)
        {
            XmlSerializer mySerializer = new XmlSerializer(typeof(Auftrag));
            FileStream myFileStream = new FileStream(fileName, FileMode.Open);
            Auftrag auftrag = (Auftrag)mySerializer.Deserialize(myFileStream);
            myFileStream.Close();
            return auftrag;
        }
    }

    public class Adresse
    {
        [XmlAttribute("Surname")]
        public string NachName;
        [XmlAttribute("Forename")]
        public string VorName;
        [XmlElement("Street")]
        public string Strasse;
        [XmlElement("City")]
        public string Stadt;
        [XmlElement("Zip")]
        public string Plz;
        public Adresse() { }
        public Adresse(string nachName, string vorName, string strasse, string plz, string stadt)
        {
            NachName = nachName;
            VorName = vorName;
            Strasse = strasse;
            Plz = plz;
            Stadt = stadt;
        }
    }

    public class RechnungsPosten
    {
        [XmlElement("ItemName")]
        public string PostenName;
        [XmlElement("Description")]
        public string Beschreibung;
        [XmlElement("UnitPrice")]
        public decimal StueckPreis;
        [XmlElement("Quantity")]
        public int Anzahl;
        [XmlElement("LineTotal")]
        public decimal  StueckGesamtPreis
        {
            get { return StueckPreis * Anzahl; }
            set { }
        }
        public RechnungsPosten() { }
        public RechnungsPosten(string postenName, decimal stueckPreis, int anzahl)
        {
            PostenName = postenName;
            StueckPreis = stueckPreis;
            Anzahl = anzahl;
        }
        public RechnungsPosten(string postenName, string beschreibung, decimal stueckPreis, int anzahl)
        {
            PostenName = postenName;
            Beschreibung = beschreibung;
            StueckPreis = stueckPreis;
            Anzahl = anzahl;
        }
    }
}
