using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Xml; using System.Xml.Linq; using District_3_App.ProfileSocialNetworkInfoStuff.Entities; using District_3_App.Repository; namespace District_3_App.Statistics { public class StatisticsService { private int timeSpentOnAppToday = 0; private int timeSpentOnAppMonthly = 0; private int timeSpentOnAppWeekly = 0; private Dictionary friends = new Dictionary(); private Window mainWindow; private string filePath; public StatisticsService(string filePath) { this.mainWindow = Application.Current.MainWindow; this.filePath = GenerateDefaultFilePath(); Console.WriteLine(filePath); if (!File.Exists(filePath)) { CreateXml(filePath); } Load(filePath); var sortedSequence = friends.OrderByDescending(pair => pair.Value); Dictionary sortedDictionary = sortedSequence.ToDictionary(pair => pair.Key, pair => pair.Value); friends = sortedDictionary; SaveStreaksToXML(); ReadXML(); } private string GenerateDefaultFilePath() { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Stats.xml"); } public void CreateXml(string filePath) { XDocument xDocument = new XDocument(new XElement("Friends")); xDocument.Save(filePath); } private void Load(string filePath) { Console.WriteLine("Reading from file: " + filePath); XDocument xDocument = XDocument.Load(filePath); XElement root = xDocument.Element("Friends"); if (!root.HasElements) { throw new Exception("No friend elements found in the XML file."); } foreach (var friendElem in root.Elements("Friend")) { string username = friendElem.Element("Username")?.Value; int streak = int.Parse(friendElem.Element("Streak")?.Value ?? "0"); if (!string.IsNullOrEmpty(username)) { User user = new User(Guid.NewGuid(), username, string.Empty, string.Empty, DateTime.Now.ToString()); // Fill in appropriate values for other properties friends.Add(user, streak); } } } public void SaveStreaksToXML() { XDocument xDocument = XDocument.Load(filePath); XElement root = xDocument.Element("Friends"); root.Elements("Friend").Remove(); foreach (var kvp in friends) { XElement friendElem = new XElement("Friend", new XElement("Username", kvp.Key.Username), new XElement("Streak", kvp.Value)); root.Add(friendElem); } xDocument.Save(filePath); } private static int GetIso8601WeekOfYear(DateTime time) { // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll // be the same week# as whatever Thursday, Friday or Saturday are, // and we always get those right DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time); if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { time = time.AddDays(3); } // Return the week of our adjusted day return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); } private void ReadXML() { // Read from the XML file try { DateTime dateValue; // Load the XML document from the file string filePath = "TimeData.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filePath); // Get the root element XmlElement root = xmlDoc.DocumentElement; // Get all entry elements XmlNodeList entryNodes = root.SelectNodes("Entry"); // Iterate over each entry element foreach (XmlNode entryNode in entryNodes) { // Get the time and date elements for this entry XmlNode timeNode = entryNode.SelectSingleNode("Time"); XmlNode dateNode = entryNode.SelectSingleNode("Date"); if (timeNode != null && dateNode != null) { // Parse the time value and add it to the timeSpentOnAppToday variable int timeValue; if (int.TryParse(timeNode.InnerText, out timeValue) && DateTime.TryParse(dateNode.InnerText, out dateValue)) { int day = dateValue.Day; int week = GetIso8601WeekOfYear(dateValue); int month = dateValue.Month; if (day == DateTime.Now.Day) { timeSpentOnAppToday += timeValue; timeSpentOnAppWeekly += timeValue; timeSpentOnAppMonthly += timeValue; } else if (week == GetIso8601WeekOfYear(DateTime.Now)) { timeSpentOnAppWeekly += timeValue; timeSpentOnAppMonthly += timeValue; } else if (month == DateTime.Now.Month) { timeSpentOnAppMonthly += timeValue; } } // Get the date value } } } catch (Exception ex) { // Handle any exceptions MessageBox.Show($"Error reading time data from XML file: {ex.Message}"); } } public List GetFriendNames() { List friendNames = new List(); int contor = 5; foreach (User user in friends.Keys) { contor--; friendNames.Add(user.Username); if (contor == 0) { return friendNames; } } return friendNames; } public List GetUserStreaks() { List friendStreaks = new List(); int contor = 5; foreach (User user in friends.Keys) { contor--; friendStreaks.Add(friends[user]); if (contor == 0) { return friendStreaks; } } return friendStreaks; } public int GetToday() { return timeSpentOnAppToday; } public int GetWeek() { return timeSpentOnAppWeekly; } public int GetMonth() { return timeSpentOnAppMonthly; } public string ConvertSecondsToHMS(int timeSpentOnApp) { // Calculate hours int hours = timeSpentOnApp / 3600; // Calculate remaining seconds after removing hours int remainingSeconds = timeSpentOnApp % 3600; // Calculate minutes int minutes = remainingSeconds / 60; // Calculate remaining seconds after removing minutes int seconds = remainingSeconds % 60; // Format the result as hours:minutes:seconds return $"{hours:D2}h{minutes:D2}min"; } } }