// <copyright file="AccueilController.cs" company=" Equipe 1 - ">
// Copyright (c)  Equipe 1 - . All rights reserved.
// </copyright>

namespace Webzine.WebApplication.Controllers
{
    using Microsoft.AspNetCore.Mvc;
    using Webzine.Repository.Fake;
    using Webzine.WebApplication.ViewModels.Accueil;

    /// <summary>
    /// Permet de retourner la page d'accueil avec tous les éléments.
    /// </summary>
    public class AccueilController : Controller
    {
        // Injection du logger via le constructeur
        private readonly ILogger<AccueilController> logger;
        private readonly IConfiguration configuration;

        /// <summary>
        /// Initialise une nouvelle instance de la classe <see cref="AccueilController"/>.
        /// </summary>
        /// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
        /// <param name="configuration">Service d'injection de configuration pour accéder aux paramètres de l'application.</param>
        public AccueilController(ILogger<AccueilController> logger, IConfiguration configuration)
        {
            this.logger = logger;
            this.configuration = configuration;
            this.logger.LogDebug(1, "initialisation du AccueilController");
        }

        /// <summary>
        /// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires.
        /// </summary>
        /// <returns>La vue Index avec le ViewModel contenant les listes de titres à afficher.</returns>
        public IActionResult Index()
        {
            this.logger.LogInformation("Arrivée sur la page d'accueil");

            var derniereChronique = this.configuration.GetValue<int>("Webzine:NombreDerniereChronique");
            var topTitres = this.configuration.GetValue<int>("Webzine:NombreDeTopTitres");
            var titres = FakeDataFactory.GetTitres();

            var vm = new AccueilIndexViewModel
            {
                DerniersTitres = titres
                    .OrderByDescending(t => t.DateCreation)
                    .Take(derniereChronique)
                    .ToList(),

                TopTitres = titres
                    .OrderByDescending(t => t.NbLikes)
                    .Take(topTitres)
                    .ToList(),
            };

            return this.View(vm);
        }
    }
}
