using CD67.FicheCollege.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using System.Linq.Expressions;
using System.Linq.Dynamic;

namespace CD67.FicheCollege.Factory
{
    public class EducfEtablissementFactory : IDisposable
    {
        /// <summary>
        /// Context Entity Framework utilisé dans la classe
        /// </summary>
        protected EducfEntities dbContext;

        #region Constructeurs
        /// <summary>
        /// Constructeur sans argument pour les classes sans contexts Entity
        /// </summary>
        public EducfEtablissementFactory() { }

        /// <summary>
        /// Constructeur avec initialisation du context Entity Framework
        /// </summary>
        /// <param name="dbContext">Context Entity Framework</param>
        public EducfEtablissementFactory(EducfEntities dbContext)
        {
            this.dbContext = dbContext;
        }
        #endregion

        #region Méthodes génériques
        private DbSet<etablissement> ObjectSet
        {
            get
            {
                return this.dbContext.Set<etablissement>();
            }
        }

        public virtual etablissement getById(params object[] keyValues)
        {
            return ObjectSet.Find(keyValues);
        }

        public virtual etablissement getByRne(string codeRne)
        {
            return ObjectSet.Where(e => e.numero == codeRne).FirstOrDefault();
        }

        public virtual etablissement getBy(Expression<Func<etablissement, bool>> expression)
        {
            return ObjectSet.Where(expression).FirstOrDefault();
        }

        public virtual etablissement getBy(string dynamicExpression)
        {
            return ObjectSet.Where(dynamicExpression).FirstOrDefault();
        }


        public virtual IQueryable<etablissement> getAll()
        {
            return getAll(null);
        }

        public virtual IQueryable<etablissement> getAll(string sortParameter = null)
        {
            if (sortParameter != null) return ObjectSet.OrderBy(sortParameter);
            else return ObjectSet;
        }

        public virtual IQueryable<etablissement> getManyBy(Expression<Func<etablissement, bool>> expression, string sortParameter = null)
        {
            IQueryable<etablissement> query = ObjectSet.Where(expression);
            if (sortParameter != null) query = query.OrderBy(sortParameter);
            return query;
        }

        public virtual IQueryable<etablissement> getManyBy(string dynamicExpression, string sortParameter = null)
        {
            IQueryable<etablissement> query = ObjectSet.Where(dynamicExpression);
            if (sortParameter != null) query = query.OrderBy(sortParameter);
            return query;
        }

        #endregion

        #region Dispose
        private bool disposed = false;

        /// <summary>
        /// Fonction pour détruire proprement la classe après utilisation
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    dbContext.Dispose();
                }
            }
            this.disposed = true;
        }

        /// <summary>
        /// Fonction pour détruire proprement la classe après utilisation
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion
    }
}