using Microsoft.AspNetCore.Mvc;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire;

namespace Webzine.WebApplication.Areas.Administration.Controllers
{
    [Area("Administration")]
    public class CommentaireController : Controller
    {
        private readonly ILogger<CommentaireController> _logger;
        private readonly List<Commentaire> _commentaires;

        /// <summary>
        /// Initialise une nouvelle instance du <see cref="CommentaireController"/>.
        /// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
        /// </summary>
        /// <param name="logger">Service de journalisation injecté.</param>
        public CommentaireController(ILogger<CommentaireController> logger)
        {
            this._logger = logger;

            this._logger.LogInformation("Initialisation du contrôleur CommentaireController.");

            var factory = new DataFactory(); // TODO injecter le factory via DI pour éviter de le recréer à chaque fois
            // faire une classe statique

            var _artistes = factory.GenerateArtists(10);
            var _styles = factory.GenerateStyles(10);
            var _titres = factory.GenerateTitres(30, _artistes, _styles);

            _commentaires = factory.GenerateCommentaires(50, _titres);

            this._logger.LogInformation("Données fictives générées avec succès.");
        }

        /// <summary>
        /// Affiche la liste des commentaires dans la vue Index.
        /// </summary>
        /// <returns>>La vue Index avec le ViewModel contenant la liste des commentaires.</returns>
        public IActionResult Index()
        {
            // Création de données "bouchon" (mock) pour tester l'affichage

            // Initialisation du ViewModel
            var viewModel = new CommentaireViewModel
            {
                Commentaires = _commentaires
            };

            return View(viewModel);
        }


        /// <summary>
        /// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails du commentaire à supprimer à partir de l'identifiant fourni.
        /// </summary>
        /// <param name="id">L'identifiant du commentaire à supprimer.</param>
        /// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une redirection vers l'index si le commentaire n'existe pas.</returns>
        public IActionResult Delete(int id)
        {
            var commentaire = _commentaires
                .FirstOrDefault(c => c.IdCommentaire == id);

            if (commentaire == null)
            {
                this._logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id);
                return RedirectToAction("Index");
            }

            var vm = new CommentaireDeleteViewModel
            {
                IdCommentaire = commentaire.IdCommentaire,
                Auteur = commentaire.Auteur,
                Contenu = commentaire.Contenu,
                DateCreation = commentaire.DateCreation,
                TitreLibelle = commentaire.Titre?.Libelle
            };

            return View(vm);
        }
    }
}