using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using System;
using static System.Console;

namespace ex_042_013_OneToOne_FluentAPI
{
    public class Program
    {
        /// <summary>
        /// Cet exemple montre comment construire une relation 1-1 dans la base de données en utilisant la Fluent API d'Entity Framework.
        /// </summary>
        static void Main(string[] args)
        {
            OutputEncoding = System.Text.Encoding.UTF8;

            try
            {
                using (NounoursDBEntities db = new NounoursDBEntities())
                {
                    WriteLine("Contenu de la base (nounours) : ");
                    foreach (var n in db.NounoursSet.Include(n => n.Carnet))
                    {
                        WriteLine($"\t{n}, LastModified: {n.Carnet.LastModified.ToString("d")}");
                    }

                    WriteLine("Contenu de la base (carnets de santé) : ");
                    foreach (var c in db.Carnets)
                    {
                        WriteLine($"\t{c}");
                    }

                    WriteLine("\nAjout d'un nounours et de son carnet de santé\n");
                    
                    Nounours porg = new Nounours { Nom = "Porg", DateDeNaissance = new DateTime(2017, 7, 19), NbPoils = 123 };
                    CarnetDeSante carnetPorg = new CarnetDeSante { LastModified = DateTime.Now, Owner = porg };
                    porg.Carnet = carnetPorg;

                    db.AddRange(porg, carnetPorg);

                    db.SaveChanges();
                }
                using (NounoursDBEntities db = new NounoursDBEntities())
                {
                    WriteLine("Contenu de la base (nounours) : ");
                    foreach (var n in db.NounoursSet.Include(n => n.Carnet))
                    {
                        WriteLine($"\t{n}, LastModified: {n.Carnet.LastModified.ToString("d")}");
                    }

                    WriteLine("Contenu de la base (carnets de santé) : ");
                    foreach (var c in db.Carnets)
                    {
                        WriteLine($"\t{c}");
                    }
                }
            }
            catch (NotImplementedException exception)
            {
                WriteLine(exception.Message);
            }
            catch (SqliteException)
            {
                WriteLine("Votre base de données n'existe pas. C'est peut-être la première fois que vous exécutez cet exemple.");
                WriteLine("Pour créer la base de données, suivez les instructions données dans le fichier ReadMe.md associé à cet exemple.");
            }

            ReadLine();
        }
    }
}
