using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
using CG67.FicheCollege.Domaine;
using CG67.FicheCollege.Entrepot;
using CG67.FicheCollege.Interface;
using System.Collections;

namespace CG67.FicheCollege.Service
{
    /// <summary>
    /// Une méthode est déclarée pour chaque Entrepot, ceci permet l'appel en static depuis n'importe où
    /// y compris depuis une page ASP.
    /// </summary>
    [DataObject]
    public static class ServiceFiche
    {
        public static IList<ActionEducative> GetActionEducativeByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotActionEducative().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }

        public static IList<ClasseDecouverte> GetClasseDecouverteByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotClasseDecouverte().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<ATC> GetATCByRNE(string codeRNE)
        {
            try
            {
                return EntrepotFactory.GetEntrepotATC().GetByCodeRNE(codeRNE);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<ContratAide> GetContratAideByRNE(string codeRNE)
        {
            try
            {
                return EntrepotFactory.GetEntrepotContratAide().GetByCodeRNE(codeRNE);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<Bilinguisme> GetBilinguismeByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotBilinguisme().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static Dotation GetDotationByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotDotation().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<InvestissementDCE> GetEquipementByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotEquipement().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<Investissement> GetInvestissementByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotInvestissement().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }

        public static IList<EffectifDetail> GetEffectifDetailByCodeRNEAndAnnee(string codeRNE, int annee)
         {
        try
            {
                return EntrepotFactory.GetEntrepotEffectifDetail().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }

    }
        public static Logement GetLogementByRNE(string codeRNE)
        {
            try
            {
                return EntrepotFactory.GetEntrepotLogement().GetByCodeRNE(codeRNE);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static MCG GetMCGByRNE(string codeRNE)
        {
            try
            {
                return EntrepotFactory.GetEntrepotMCG().GetByCodeRNE(codeRNE);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<ProjetPilote> GetProjetPiloteByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotProjetPilote().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<RestaurationExterne> GetRestaurationExterneByRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotRestaurationExterne().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static IList<Contact> GetContactByRNE(string codeRNE)
        {
            try
            {
                return EntrepotFactory.GetEntrepotContact().GetByCodeRNE(codeRNE);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static ChiffresSignificatifs GetChiffresSignificatifsByAnnee(int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotChiffresSignificatifs().GetByAnnee(annee);
            }
            catch (Exception erreur)
            {
                throw new Exception(erreur.ToString());
            }
        }
        public static Commentaires GetCommentairesByCodeRNE(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotCommentaires().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch 
            {
                throw;
            }
        }
        public static Restauration GetRestaurationByCodeRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotRestauration().GetByRNEAndAnnee(codeRNE, annee);
            }
            catch
            {
                throw;
            }
        }
        public static SoutienScolaireEnLigne GetSoutienScolaireEnLigneByCodeRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotSoutienScolaireEnLigne().GetByRNEAndAnnee(codeRNE, annee);
            }
            catch
            {
                throw;
            }
        }
        public static IList<ProgTravaux> GetProgTravauxByCodeRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotProgTravaux().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch
            {
                throw;
            }
        }
        public static IList<Etablissement> GetAllEtablissement()
        {
            try
            {
                return EntrepotFactory.GetEntrepotEtablissement().GetAll();
            }
            catch
            {
                throw;
            }
        }
        public static Etablissement GetEtablissementByCodeRNEAndAnnee(string codeRNE, int annee)
        {
            try
            {
                return EntrepotFactory.GetEntrepotEtablissement().GetByCodeRNEAndAnnee(codeRNE, annee);
            }
            catch 
            {
                throw;
           }
        }
        private static XmlNode  GetXml(Object aSerialiser,XmlDocument document)
        {
            XmlNode resultat = document.CreateElement(aSerialiser.GetType().Name);
            foreach (PropertyInfo pi in aSerialiser.GetType().GetProperties())
            {               
                if (pi.PropertyType.IsSerializable)
                {
                    object valeur = pi.GetValue(aSerialiser, null);
                    resultat.AppendChild(document.CreateElement(pi.Name)).InnerXml = valeur == null ? string.Empty : valeur.ToString() ;                    
                }
                
             
            }
            return resultat;
        }
        static XmlNode Serializer(Object objet, XmlDocument doc)
        {
            
            XmlNode resultat = doc.CreateElement(objet.GetType().Name);
            
            foreach (PropertyInfo pi in objet.GetType().GetProperties())
            {
                // Si la propriété comporte une méthode "count" je considère c'est une Liste
                if (pi.GetValue(objet, null) != null)
                {
                    MethodInfo mi = pi.GetValue(objet, null).GetType().GetMethod("get_Count");
                    if (mi != null)
                    {
                        object objListe = pi.GetValue(objet, null);
                        int nb = (int)(mi.Invoke(objListe, null));
                        //  a revoir
                        XmlElement element = doc.CreateElement(pi.Name);
                       // element.Normalize();
                        XmlNode item = resultat.AppendChild(element);
                        for (int i = 0; i < nb; i++)
                        { // on sérialise tous les items de la liste
                            object obj = objListe.GetType().GetMethod("get_Item").Invoke(objListe, new Object[] { i });
                            item.AppendChild(Serializer(obj, doc));
                        }
                    }
                    else // c'est pas une Liste
                    {
                        switch (pi.GetValue(objet, null).GetType().Name)
                        { // si c'est une type de "base" on l'affiche
                            case "String":
                            case "Int16":
                            case "Int32":
                            case "Double":
                            case "Single":
                            case "Boolean":
                                resultat.AppendChild(doc.CreateElement(pi.Name)).InnerXml = pi.GetValue(objet, null).ToString();
                                break;
                            default: // sinon on le décompose recursivement
                                resultat.AppendChild(Serializer(pi.GetValue(objet, null), doc));
                                break;
                        }
                    }
                }
            }
            return resultat;
        }
    

        public static XmlNode GetFicheCollege(string codeRNE, int annee)
        {
                        
            XmlDocument resultat = new XmlDocument();             
            XmlNode xmlCollege = resultat.AppendChild(resultat.CreateElement("college"));
            
            Etablissement etablissement = GetEtablissementByCodeRNEAndAnnee(codeRNE, annee);
            xmlCollege.AppendChild(Serializer(etablissement,resultat));
            ChiffresSignificatifs chiffres = GetChiffresSignificatifsByAnnee(annee);
            xmlCollege.AppendChild(Serializer(chiffres,resultat));     
            return resultat;
        
        }

   
  
    }
}
