using System.Text.Json; using Microsoft.AspNetCore.Mvc; using PlanTempus.Application.Features.Localization.Services; namespace PlanTempus.Application.Features.Employees.Components; public class EmployeeDetailHoursViewComponent : ViewComponent { private readonly ILocalizationService _localization; private readonly IWebHostEnvironment _environment; public EmployeeDetailHoursViewComponent(ILocalizationService localization, IWebHostEnvironment environment) { _localization = localization; _environment = environment; } public IViewComponentResult Invoke(string key) { var weekSchedule = LoadMockData(); var employee = weekSchedule.Employees.FirstOrDefault(e => e.EmployeeId == key); var weeks = GenerateWeeks(weekSchedule, employee); var model = new EmployeeDetailHoursViewModel { EmployeeId = key, Weeks = weeks, DayNames = new[] { "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag" }, LabelHours = _localization.Get("employees.detail.hours.label") }; return View(model); } private WeekScheduleData LoadMockData() { var jsonPath = Path.Combine(_environment.ContentRootPath, "Features", "Employees", "Data", "workScheduleMock.json"); var json = System.IO.File.ReadAllText(jsonPath); return JsonSerializer.Deserialize(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true })!; } private List GenerateWeeks(WeekScheduleData weekSchedule, EmployeeScheduleData? employee) { var weeks = new List(); var startDate = DateTime.Parse(weekSchedule.StartDate); // Generate 6 weeks of data (current week + 5 more) for (int w = 0; w < 6; w++) { var weekStart = startDate.AddDays(w * 7); var weekNumber = GetWeekNumber(weekStart); var days = new List(); var totalMinutes = 0; for (int d = 0; d < 7; d++) { var date = weekStart.AddDays(d); var dateKey = date.ToString("yyyy-MM-dd"); var shift = employee?.Schedule.GetValueOrDefault(dateKey); string status = "off"; string display = "—"; if (shift != null) { status = shift.Status; if (shift.Status == "work" && shift.Start != null && shift.End != null) { display = $"{shift.Start} - {shift.End}"; totalMinutes += CalculateMinutes(shift.Start, shift.End); } else if (shift.Status == "vacation") { display = "Ferie"; } else if (shift.Status == "sick") { display = "Syg"; } } days.Add(new DayHoursData { Date = dateKey, Status = status, Display = display }); } weeks.Add(new WeekHoursData { WeekNumber = weekNumber, TotalHours = totalMinutes / 60, Days = days }); } return weeks; } private int GetWeekNumber(DateTime date) { var cal = System.Globalization.CultureInfo.CurrentCulture.Calendar; return cal.GetWeekOfYear(date, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); } private int CalculateMinutes(string start, string end) { var startTime = TimeSpan.Parse(start); var endTime = TimeSpan.Parse(end); return (int)(endTime - startTime).TotalMinutes; } } public class EmployeeDetailHoursViewModel { public required string EmployeeId { get; init; } public required List Weeks { get; init; } public required string[] DayNames { get; init; } public required string LabelHours { get; init; } } public class WeekHoursData { public int WeekNumber { get; init; } public int TotalHours { get; init; } public required List Days { get; init; } } public class DayHoursData { public required string Date { get; init; } public required string Status { get; init; } public required string Display { get; init; } }