Files
School/Anul 2/Semestrul 2/ISS/Lab5/CasualProfile/District 3 App/Statistics/StatisticsService.cs
T
2024-08-31 12:07:21 +03:00

244 lines
8.1 KiB
C#

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<User, int> friends = new Dictionary<User, int>();
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<User, int> 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<string> GetFriendNames()
{
List<string> friendNames = new List<string>();
int contor = 5;
foreach (User user in friends.Keys)
{
contor--;
friendNames.Add(user.Username);
if (contor == 0)
{
return friendNames;
}
}
return friendNames;
}
public List<int> GetUserStreaks()
{
List<int> friendStreaks = new List<int>();
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";
}
}
}