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

namespace CD67.FicheCollege.Factory
{
    public partial class RestaurationTypeRepaFactory : Internal.BaseFactory<Entity.RestaurationTypeRepa>
    {
        public override IQueryable<Entity.RestaurationTypeRepa> getAll()
        {
            return base.getAll("Ordre");
        }

        public IQueryable<Entity.RestaurationTypeRepa> getAllValid()
        {
            return base.getAll("Ordre").Where(i => i.Valid == true);
        }

        public IQueryable<Entity.RestaurationTypeRepa> getAllValid(RestaurationParametre param)
        {
            if (param.RestaurationTypeRepas.Count == 0) this.dbContext.Entry(param).Collection(i => i.RestaurationTypeRepas).Load();
            IQueryable<Entity.RestaurationTypeRepa> typeRepas = param.RestaurationTypeRepas.AsQueryable();

            return typeRepas.Where(i => i.Valid == true).OrderBy(i => i.Ordre);
        }

        public void Up(ref Entity.RestaurationTypeRepa item)
        {
            int ordre = item.Ordre;

            //Cas de sortie immédiate
            if (item.Ordre == 1) return;

            Entity.RestaurationTypeRepa itemToSubstitute = dbContext.RestaurationTypeRepas.Where(i => i.Ordre == ordre - 1).First();
            itemToSubstitute.Ordre += 1;
            item.Ordre -= 1;
            dbContext.SaveChanges();
        }

        public void Down(ref Entity.RestaurationTypeRepa item)
        {
            int ordre = item.Ordre;

            //Cas de sortie immédiate
            if (item.Ordre == dbContext.RestaurationTypes.Max(i => i.Ordre)) return;

            Entity.RestaurationTypeRepa itemToSubstitute = dbContext.RestaurationTypeRepas.Where(i => i.Ordre == ordre + 1).First();
            itemToSubstitute.Ordre -= 1;
            item.Ordre += 1;
            dbContext.SaveChanges();
        }

        private void Sort()
        {
            int ordre = 1;
            foreach (Entity.RestaurationTypeRepa statut in dbContext.RestaurationTypeRepas.OrderBy(i => i.Ordre))
            {
                statut.Ordre = ordre++;
            }
            dbContext.SaveChanges();
        }

        public override void add(ref Entity.RestaurationTypeRepa entity)
        {
            //Initialisation de l'ordre
            if (dbContext.RestaurationTypeRepas.Count() == 0) entity.Ordre = 1;
            else entity.Ordre = dbContext.RestaurationTypeRepas.Max(i => i.Ordre) + 1;

            base.add(ref entity);
        }

        public override void delete(ref Entity.RestaurationTypeRepa entity)
        {
            base.delete(ref entity);
            Sort();
        }
    }
}