using CD67.ModeleMVC.Entity;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CD67.ModeleMVC.Factory
{
    public class VIKINGSFactory : Internal.BaseFactory
    {
        /// <summary>
        /// Constructeur public lié au constructeur de base
        /// </summary>
        /// <param name="dbContext">Context Entity Framework utilisé dans la classe</param>
        public VIKINGSFactory(Entities dbContext) : base(dbContext) { }

        /// <summary>
        /// Retourne un objet par son Id
        /// </summary>
        /// <param name="Id">Id recherché</param>
        /// <returns>Objet recherché</returns>
        public EXEMPLE_VIKINGS getById(int Id)
        {
            return dbContext.EXEMPLE_VIKINGS.Find(Id);
        }

        /// <summary>
        /// Retourne tous les objets
        /// </summary>
        /// <returns>Liste d'objets</returns>
        public List<EXEMPLE_VIKINGS> getAll()
        {
            //Ce n'est pas nécessaire ici (un lazy loading est présent par défaut), mais j'ai ajouté un include explicite pour charger les sous-objets "EXEMPLE_TYPE_VIKING"
            return dbContext.EXEMPLE_VIKINGS.Include(item => item.EXEMPLE_TYPE_VIKING).ToList();
        }

        /// <summary>
        /// Ajout de l'objet dans le context
        /// </summary>
        /// <param name="viking">Objet à ajouter passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
        public void add(ref EXEMPLE_VIKINGS viking)
        {
            dbContext.EXEMPLE_VIKINGS.Add(viking);
            dbContext.SaveChanges();
        }

        /// <summary>
        /// Mise à jour de l'objet dans le context
        /// </summary>
        /// <param name="viking">Objet à mettre à jour passé en référence pour obtenir le résultat des triggers ou numéroauto</param>
        public void update(ref EXEMPLE_VIKINGS viking)
        {
            // On attache l'objet en paramètre au contexte, on le note bien comme modifié pour qu'il soit mis à jour
            dbContext.EXEMPLE_VIKINGS.Attach(viking);
            dbContext.Entry(viking).State = EntityState.Modified;
            dbContext.SaveChanges();
        }

        /// <summary>
        /// Suppression de l'objet dans le context
        /// </summary>
        /// <param name="viking">Objet à supprimer</param>
        public void delete(ref EXEMPLE_VIKINGS viking)
        {
            // Attention à ajouter ici d'éventuel contrôle ou suppression en cascade
            dbContext.EXEMPLE_VIKINGS.Remove(viking);
            dbContext.SaveChanges();
        }
    }
}
