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

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

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

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

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

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

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

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

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

            base.add(ref entity);
        }

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

        public ActionEdu clone_to_year(ActionEdu actionEdu, int annee_id)
        {
            if (base.getAll().Where(a => a.AnneeId == annee_id && a.TokenId == actionEdu.TokenId).Count() > 0)
            {
                throw new InvalidOperationException("Cette action éducative existe déjà pour l'année cible");
            }

            ActionEdu clone = new ActionEdu();
            // Nouvelle année
            clone.AnneeId = annee_id;
            // On reprend les valeurs de tous les autres champs
            clone.Numero = actionEdu.Numero;
            clone.Nom = actionEdu.Nom;
            clone.Montant = actionEdu.Montant;
            clone.Description = actionEdu.Description;
            clone.CommentaireInterne = actionEdu.CommentaireInterne;
            clone.CommentairePublic = actionEdu.CommentairePublic;
            clone.Neutralise = actionEdu.Neutralise;
            clone.Ordre = actionEdu.Ordre;
            clone.StatutId = actionEdu.StatutId;
            clone.ActionEduThematiqueId = actionEdu.ActionEduThematiqueId;
            clone.TokenId = actionEdu.TokenId;

            // Recréé les affectations
            foreach (ActionEduCollege actionEduCollege in actionEdu.ActionsEduColleges)
            {
                ActionEduCollege cloneActionEduCollege = new ActionEduCollege();
                cloneActionEduCollege.Commentaire = actionEduCollege.Commentaire;
                cloneActionEduCollege.NbEleves = actionEduCollege.NbEleves;

                try
                {
                    cloneActionEduCollege.College = dbContext.Colleges.Where(c => c.TokenId == actionEduCollege.College.TokenId && c.Annee_Id == annee_id).First();
                }
                catch(InvalidOperationException) {
                    throw new InvalidOperationException("Un ou plusieurs collegesaffectés à cette action n'ont pas été créés pour l'année en cours");
                }
                clone.ActionsEduColleges.Add(cloneActionEduCollege);
            }

            // enregistre le clone en base
            base.add(ref clone);

            return clone;
        }
    }
}
