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


namespace CG67.FicheCollege.Domaine
{
    public delegate IList<RestaurationExterne> dlgLoadRestaurationExterne(string codeRNE, int annee);    
    [Serializable]
    public class Restauration
    {
        private dlgLoadRestaurationExterne LoaderRestaurationExterne;
        private string mCodeRNE;
        private int mAnnee;
        /// <summary>
        /// Nombre total de rationnaire.
        /// </summary>
        private int mNbrPersonnes;
        /// <summary>
        /// Liste de restaurations externes,
        /// si cette liste à pour valeur null, c'est que l'établissement dispose d'une cantine
        /// sinon cette liste regroupera tous les types de restauration externes utilisés
        /// (télérestauration, hébergement, ...)
        /// </summary>
        private IList<RestaurationExterne> mLstRestaurationExterne;

        /// <summary>
        /// Obtient ou définit le nombre total de rationnaire.
        /// </summary>
        public int NbrPersonnes
        {
            get { return mNbrPersonnes; }
            set { mNbrPersonnes = value; }
        }
        /// <summary>
        /// Obtient ou définit la liste de restaurations externes.
        /// </summary>
        public IList<RestaurationExterne> LstRestaurationExterne
        {
            get {
                if (mLstRestaurationExterne == null)
                    mLstRestaurationExterne = this.LoaderRestaurationExterne(mCodeRNE, mAnnee);
                return mLstRestaurationExterne;    
            }
                set { mLstRestaurationExterne = value; }
           
        }

        public Restauration(int annee, string codeRNE, int nbrPersonnes, dlgLoadRestaurationExterne loaderRestaurationExterne)
        {
            this.mAnnee = annee;
            this.mNbrPersonnes = nbrPersonnes;
            this.mCodeRNE = codeRNE;
            this.LoaderRestaurationExterne = loaderRestaurationExterne;
        }

        public override string ToString()
        {
            string retour = NbrPersonnes + " rationnaires";
            if (LstRestaurationExterne.Count == 0)
                retour += ". \nL'établissement dispose d'une restauration interne.";
            else
            {
                int nbrAide = 0;
                string retourAide = string.Empty;
                foreach (RestaurationExterne restaur in LstRestaurationExterne)
                {
                    retourAide += "\n - " + restaur.NbrPersonnes + " " + restaur.TypeRestauration + " par l'établissement " + restaur.NomCollege + ".";
                    nbrAide += restaur.NbrPersonnes;
                }

                retour += " : ";
                int difference = NbrPersonnes - nbrAide;
                if (difference != 0)
                    retour += "\n - L'établissement ne dispose pas d'une restauration suffisante, de ce fait uniquement " + difference + " élèves sont réstaurés en interne.";

                retour += retourAide;
            }

            return retour;
        }
    }
}
