// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
//                         marc.chevaldonne.free.fr
//
// Module        : DbContextInitializer.cs
// Author        : Marc Chevaldonné
// Creation date : 2016-10-19
//
// ========================================================================

using Microsoft.EntityFrameworkCore;
using System;

namespace ex_042_008_EF_CF_One_to_Many
{
    /// <summary>
    /// initialiseur de stratégies...
    /// </summary>
    public static class DbContextInitializer
    {
        /// <summary>
        /// remplissage de la base avec des données stubbées.
        /// </summary>
        /// <param name="context">base à remplir</param>
        public static void Seed(AlbumDBEntities context)
        {
            SetInitializer(context, InitializationStrategies.DropCreateDatabaseAlways);

            Album kindofblue = new Album { Titre = "Kind of Blue", DateDeSortie = new DateTime(1959, 8, 17) };
            Morceau[] kindofblueMorceaux = { new Morceau { Album = kindofblue, Titre = "So What" },
                                             new Morceau { Album = kindofblue, Titre = "Freddie Freeloader" },
                                             new Morceau { Album = kindofblue, Titre = "Blue in Green" },
                                             new Morceau { Album = kindofblue, Titre = "All Blues" },
                                             new Morceau { Album = kindofblue, Titre = "Flamenco Sketches" } };
            foreach (var m in kindofblueMorceaux) kindofblue.Morceaux.Add(m);

            Album dialogue = new Album { Titre = "Dialogue", DateDeSortie = new DateTime(1965, 9, 1) };
            Morceau[] dialogueMorceaux = { new Morceau { Album = dialogue, Titre = "Catta" },
                                             new Morceau { Album = dialogue, Titre = "Idle While" },
                                             new Morceau { Album = dialogue, Titre = "Les Noirs Marchant" },
                                             new Morceau { Album = dialogue, Titre = "Dialogue" },
                                             new Morceau { Album = dialogue, Titre = "Ghetto Lights" },
                                             new Morceau { Album = dialogue, Titre = "Jasper" } };
            foreach (var m in dialogueMorceaux) dialogue.Morceaux.Add(m);

            context.Albums.AddRange(new Album[] { kindofblue, dialogue });
            context.Morceaux.AddRange(kindofblueMorceaux);
            context.Morceaux.AddRange(dialogueMorceaux);

            context.SaveChanges();
        }

        /// <summary>
        /// les différentes stratégies de création de la base
        /// </summary>
        public enum InitializationStrategies
        {
            CreateDatabaseIfNotExists,
            DropCreateDatabaseIfModelChanges,
            DropCreateDatabaseAlways
        }
        public static void SetInitializer(DbContext context, InitializationStrategies strategy)
        {
            switch (strategy)
            {
                //par défaut : crée la base seulement si elle n'existe pas
                default:
                case InitializationStrategies.CreateDatabaseIfNotExists:
                    context.Database.EnsureCreated();
                    break;

                //recrée la base même si elle existe déjà
                case InitializationStrategies.DropCreateDatabaseAlways:
                    context.Database.EnsureDeleted();
                    context.Database.EnsureCreated();
                    break;

                //recrée la base seulement si le modèle change : impossible aujourd'hui en Entity Framework Core...
                case InitializationStrategies.DropCreateDatabaseIfModelChanges:
                    throw new NotImplementedException("Le mode DropCreateDatabaseIfModelChanges ne peut pas encore exister sous Entity Framework Core");
            }
        }
    }
}
