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

namespace Webzine.WebApplication.Areas.Administration.Controllers;

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

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

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

        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 le tableau de bord de l'administration.
    /// </summary>
    /// <returns>La vue Index du tableau de bord.</returns>
    public IActionResult Index()
    {
        var artisteLePlusChronique = _titres
            .GroupBy(t => t.Artiste)
            .OrderByDescending(g => g.Count())
            .FirstOrDefault();

        var albumLePlusChronique = _titres
            .GroupBy(t => t.Artiste)
            .OrderByDescending(g => g.Select(t => t.Album).Distinct().Count())
            .FirstOrDefault();

        var musiqueLaPlusJouee = _titres
            .OrderByDescending(t => t.NbLectures)
            .FirstOrDefault();

        var model = new DashboardViewModel
        {
            NombreArtistes  = _artistes.Count,

            ArtisteLePlusChronique = artisteLePlusChronique?.Key.Nom,

            AlbumLePlusChronique = albumLePlusChronique?.Key.Nom,

            NombreBiographies = _artistes.Count(a => !string.IsNullOrEmpty(a.Biographie)),

            IdMusiqueLaPlusJouee = musiqueLaPlusJouee?.IdTitre ?? 0,
            MusiqueLaPlusJouee = musiqueLaPlusJouee?.Libelle,

            NombreTitres = _titres.Count,

            NombreGenres = _styles.Count,

            NombreLectures = _titres.Sum(t => t.NbLectures),

            NombreLikes = _titres.Sum(t => t.NbLikes)
        };

        return View(model);
    }
}