using System; using System.Collections.Generic; namespace ManagerService.DTOs { public class StatsSummaryDTO { public int TotalSessions { get; set; } public int AvgVisitDurationSeconds { get; set; } public List TopSections { get; set; } = new(); public List VisitsByDay { get; set; } = new(); public Dictionary LanguageDistribution { get; set; } = new(); public Dictionary AppTypeDistribution { get; set; } = new(); /// /// Nombre de sessions ayant **utilisé le vocal au moins une fois**. /// /// ⚠️ Ce n'est pas une entrée d', et c'est délibéré. /// Le vocal n'est pas une plateforme mais un mode d'interaction : un visiteur passe /// des lunettes à l'écran dans une même session — c'est tout l'objet du miroir. Or /// la distribution compte **une entrée par session**, tranchée sur l'événement le /// plus ancien : commencer au doigt puis mettre les lunettes aurait rendu le vocal /// invisible, et l'inverse aurait compté toute la navigation tactile comme vocale. /// Le KPI devient « part des sessions ayant utilisé le vocal », qui est vrai. /// /// C'est la conception que VisitorQuestion applique déjà : un booléen /// IsVoice **à côté** de l'AppType, pas une valeur d'AppType. /// public int VoiceSessions { get; set; } public List TopPois { get; set; } = new(); public List TopAgendaEvents { get; set; } = new(); public List QuizStats { get; set; } = new(); public List GameStats { get; set; } = new(); public List TopArticles { get; set; } = new(); public List TopMenuItems { get; set; } = new(); public QrScanStatDTO QrScans { get; set; } = new(); } public class SectionStatDTO { public string SectionId { get; set; } public string SectionTitle { get; set; } public int Views { get; set; } public int AvgDurationSeconds { get; set; } } public class DayStatDTO { public string Date { get; set; } // "2026-03-12" public int Total { get; set; } public int Mobile { get; set; } public int Tablet { get; set; } } public class PoiStatDTO { public int GeoPointId { get; set; } public string Title { get; set; } public int Taps { get; set; } public string SectionId { get; set; } } public class AgendaEventStatDTO { public string EventId { get; set; } public string EventTitle { get; set; } public int Taps { get; set; } } public class QuizStatDTO { public string SectionId { get; set; } public string SectionTitle { get; set; } public double AvgScore { get; set; } public int TotalQuestions { get; set; } public int Completions { get; set; } } public class GameStatDTO { public string GameType { get; set; } public int Completions { get; set; } public int AvgDurationSeconds { get; set; } } public class ArticleStatDTO { public string SectionId { get; set; } public int Reads { get; set; } } public class MenuItemStatDTO { public string TargetSectionId { get; set; } public string MenuItemTitle { get; set; } public int Taps { get; set; } } public class QrScanStatDTO { public int TotalScans { get; set; } public int ValidScans { get; set; } public int InvalidScans { get; set; } } }