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

namespace CLPersone
{
   
    public enum CriterioOrdinamento
    {
        CodiceFiscale,
        Cognome,
        Ruolo
    }
    
    public class Persone : List<Persona>
    {
        public new void Add(Persona p)
        {
            bool elementoInserito = false;

            foreach (Persona persona in this)
            {
                if (p.CodiceFiscale == persona.CodiceFiscale)
                {
                    elementoInserito = true;
                }
            }

            if (!elementoInserito)
            {
                base.Add(p);
            }
            else
            {
                throw new Exception();
            }
                
        }

        
        // Rimuove una persona dalla lista, dopo avergli passato il codice fiscale
        public bool Rimuovi(string codiceFiscalePersoneDaRimuovere)
        {
            bool elementoPresente = false;

            Persona personaDaRimuovere = new Persona();

            foreach (Persona persona in this)
            {
                if (persona.CodiceFiscale == codiceFiscalePersoneDaRimuovere)
                {
                    elementoPresente = true;
                    personaDaRimuovere = persona;
                }
            }

            if (elementoPresente)
            {
                this.Remove(personaDaRimuovere);
                return true;
            }
            else
            {
                return false;
            }
        }


        /// <summary>
        /// Ricerca l'indice di una persona
        /// </summary>
        /// <param name="p">Persona di cui ricercare l'indice</param>
        /// <returns>L'indice della persona oppure -1 se la persona non è presente</returns>
        public int IndiceElemento(Persona p)
        {
            int indice = -1;

            for (int i = 0; i < this.Count; i++)
            {
                if (p.CodiceFiscale == this[i].CodiceFiscale)
                {
                    indice = i;
                }
            }
            return indice;
        }




        /// <summary>
        /// Ricerca l'indice di una persona
        /// </summary>
        /// <param name="p">Codice Fiscale della persona di cui ricercare l'indice</param>
        /// <returns>L'indice della persona oppure -1 se il codice fiscale
        /// passato come parametro si riferisce ad una persona che non è presente</returns>
        public int IndiceElemento(string codiceFiscale)
        {
            int indice = -1;

            for (int i = 0; i < this.Count; i++)
            {
                if (codiceFiscale == this[i].CodiceFiscale)
                {
                    indice = i;
                }
            }
            return indice;
        }

        public bool Rimuovi(Persona p)
        {
            int indicePersona = IndiceElemento(p);

            if (indicePersona>=0)
            {
                this.Remove(p);
                return true;
            }
            else
            {
                return false;
            }
        }


        public void OrdinaPerCodiceFiscale()
        {
            bool fattoScambio = true;

            while (fattoScambio)
            {
                fattoScambio = false;
                for (int i = 0; i < this.Count - 1; i++)
                {
                    if (this[i].CodiceFiscale.CompareTo(this[i+1].CodiceFiscale)>0)
                    {
                        Persona persona = this[i];
                        this[i] = this[i + 1];
                        this[i + 1] = persona;
                        fattoScambio = true;
                    }
                }
            }
        }


        public void Ordinamento(CriterioOrdinamento ordinamento)
        {
            switch (ordinamento)
            {
                case CriterioOrdinamento.CodiceFiscale:

                    bool fattoScambio = true;

                    while (fattoScambio)
                    {
                        fattoScambio = false;
                        for (int i = 0; i < this.Count - 1; i++)
                        {
                            if (this[i].CodiceFiscale.CompareTo(this[i + 1].CodiceFiscale) > 0)
                            {
                                Persona persona = this[i];
                                this[i] = this[i + 1];
                                this[i + 1] = persona;
                                fattoScambio = true;
                            }
                        }
                    }
                    
                    break;
                case CriterioOrdinamento.Cognome:


                    fattoScambio = true;

                    while (fattoScambio)
                    {
                        fattoScambio = false;
                        for (int i = 0; i < this.Count - 1; i++)
                        {
                            if (this[i].Cognome.CompareTo(this[i + 1].Cognome) > 0)
                            {
                                Persona persona = this[i];
                                this[i] = this[i + 1];
                                this[i + 1] = persona;
                                fattoScambio = true;
                            }
                        }
                    }


                    break;
                case CriterioOrdinamento.Ruolo:

                    fattoScambio = true;

                    while (fattoScambio)
                    {
                        fattoScambio = false;
                        for (int i = 0; i < this.Count - 1; i++)
                        {
                            if (this[i].Ruolo.CompareTo(this[i + 1].Ruolo) > 0)
                            {
                                Persona persona = this[i];
                                this[i] = this[i + 1];
                                this[i + 1] = persona;
                                fattoScambio = true;
                            }
                        }
                    }
                     break;
                
            }
        }


        public override string ToString()
        {
            string elencoPersone = "";
            foreach (Persona p in this)
            {
                elencoPersone += p.ToString();
            }

            return elencoPersone;
        }

        
    }
}
