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

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

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

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

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

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

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

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

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

            base.add(ref entity);
        }

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