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 RestaurationTypeFactory : Internal.BaseFactory<Entity.RestaurationType>
    {
        public override IQueryable<Entity.RestaurationType> getAll()
        {
            return base.getAll("Ordre");
        }

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

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

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

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

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

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

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

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

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

            base.add(ref entity);
        }

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