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

namespace CLPersone
{
    public class Persone:List<Persona>
    {

        // Proprietà, con il solo get accessor, di tipo XElement
        // Si crea un elemento XML strutturato in questo modo:

        //      <persone>
        //          <persona>
        //              <cognome>valore_cognome_dato_membro_Prima_Persona</cognome> 
        //              <nome>valore_nome_dato_membro_Prima_Persona</nome> 
        //          </persona>
        //          <persona>
        //              <cognome>valore_cognome_dato_membro_Seconda_Persona</cognome> 
        //              <nome>valore_cognome_dato_membro_Seconda_Persona</nome> 
        //          </persona>
        //          ... 
        //            eventuali altri elementi persona per le persone della lista
        //          ...
        //      </persone>



        // Il primo XElement che viene creato si chiama persone e come valore
        // (quello che sta scritto dopo la virgola) ha il risultato
        // di un'interrogazione LINQ con cui si va a scorrere tutta la lista (this),
        // recuperando ad ogni iterazione una persona e prendendo di essa 
        // la proprietà XElement che ci prepara l'elemento XML secondo quanto descritto
        // nel commento della proprietà XElement della classe Persona
        public XElement XElement
        {
            get
            { 
                return new XElement("persone",
                    from persona in this
                    select persona.XElement);
            }
        }

        public Persone()
        { }





        // Inizio processo di Serializzazione della classe Persone
        // Si salva il contenuto della proprietà XElement in un file passato come parametro
        
        public void Save(string nomeFile)
        {
            XElement.Save(nomeFile);
        }



        // Inizio processo di De-Serializzazione della classe Persone
        public void Load(string nomeFile)
        {
            this.Clear();
            
            // Costruisco un XElement, che chiamo doc, prendendolo dal file passato come parametro
            XElement doc = XElement.Load(nomeFile);

            
            // Elements restituisce un insieme filtrato degli elementi figli di questo elemento
            // o documento.
            // Soltanto gli elementi che hanno un XName corrispondente vengono inclusi nell'insieme

            var pers = from persona in doc.Elements("persona")
                       select persona;

           
            // ciclando il risultato dell'interrogazione LINQ,
            // invoco ad ogni iterazione il costruttore di Persona, passandogli come parametro
            // l'XElement p che recupero da pers, ed aggiungendo la persona appena costruita
            // alla classe Persone, tramite this.Add
            foreach (XElement p in pers)
            {
                this.Add(new Persona(p));
            }

        }
    }
}
