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

namespace Webzine.WebApplication.Areas.Administration.Controllers;

[Area("Administration")]
public class TitreController : Controller
{
    private readonly ILogger<TitreController> _logger;
    private readonly List<Titre> _titres;
    private readonly List<Style> _styles;
    private readonly List<Artiste> _artistes;


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

        this._logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration.");

        var factory = new DataFactory();

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

        factory.GenerateCommentaires(50, _titres);

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

    /// <summary>
    /// Affiche la liste des titres dans la vue Index.
    /// </summary>
    /// <returns>La vue Index avec le ViewModel contenant la liste des titres.</returns>
    public IActionResult Index()
    {
        var model = _titres.Select(t => new AdminTitreList
        {
            Id = t.IdTitre,
            Artiste = t.Artiste?.Nom,
            Titre = t.Libelle,
            Duree = TimeSpan.FromSeconds(t.Duree).ToString(@"mm\:ss"),
            DateSortie = t.DateSortie,
            NbLectures = t.NbLectures,
            NbLikes = t.NbLikes,
            NbCommentaires = t.Commentaires?.Count ?? 0
        }).ToList();

        return View(model);
    }

    /// <summary>
    /// Affiche le formulaire de création d'un nouveau titre dans la vue Create.
    /// </summary>
    /// <returns>La vue Create avec le ViewModel contenant les listes déroulantes pour les artistes et les styles.</returns>
    public IActionResult Create()
    {
        var model = new AdminTitreForm
        {
            Artistes = _artistes.Select(a => new SelectListItem
            {
                Value = a.IdArtiste.ToString(),
                Text = a.Nom
            }).ToList(),

            AllStyles = _styles.Select(s => new SelectListItem
            {
                Value = s.IdStyle.ToString(),
                Text = s.Libelle
            }).ToList()
        };

        return View(model);
    }

    /// <summary>
    /// Affiche le formulaire de modification d'un titre existant dans la vue Edit, en préremplissant les champs avec les données du titre sélectionné. Les listes déroulantes pour les artistes et les styles sont également remplies pour permettre à l'utilisateur de modifier ces associations.
    /// </summary>
    /// <param name="id">L'identifiant du titre à modifier, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
    /// <returns>La vue Edit avec le ViewModel contenant les données du titre à modifier, ainsi que les listes déroulantes pour les artistes et les styles. </returns>
    public IActionResult Edit(int id)
    {
        var titre = _titres.First(t => t.IdTitre == id);

        var model = new AdminTitreForm
        {
            Id = titre.IdTitre,
            IdArtiste = titre.IdArtiste,
            Libelle = titre.Libelle,
            Album = titre.Album,
            Chronique = titre.Chronique,
            DateSortie = titre.DateSortie,
            Duree = titre.Duree,
            UrlJaquette = titre.UrlJaquette,
            UrlEcoute = titre.UrlEcoute,
            NbLectures = titre.NbLectures,
            NbLikes = titre.NbLikes,
            Styles = titre.Styles.Select(s => s.IdStyle).ToList(),

            Artistes = _artistes.Select(a => new SelectListItem
            {
                Value = a.IdArtiste.ToString(),
                Text = a.Nom
            }).ToList(),

            AllStyles = _styles.Select(s => new SelectListItem
            {
                Value = s.IdStyle.ToString(),
                Text = s.Libelle
            }).ToList()
        };

        return View(model);
    }

    /// <summary>
    /// Affiche la vue de confirmation de suppression d'un titre, en récupérant les détails du titre à supprimer à partir de l'identifiant fourni. Le ViewModel contient les informations essentielles du titre, telles que le libellé et le nom de l'artiste, pour permettre à l'utilisateur de confirmer la suppression.
    /// </summary>
    /// <param name="id">L'identifiant du titre à supprimer, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
    /// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du titre à supprimer.</returns>
    public IActionResult Delete(int id)
    {
        var titre = _titres.First(t => t.IdTitre == id);

        var model = new AdminTitreDelete
        {
            Id = titre.IdTitre,
            Titre = titre.Libelle,
            Artiste = titre.Artiste?.Nom
        };

        return View(model);
    }
}