using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; using ShiftScheduler.Shared.Models; using System.Net.Http.Json; using System.Text.Json; namespace ShiftScheduler.Client.Pages { public partial class Index : ComponentBase { [Inject] private HttpClient HttpClient { get; set; } = default!; [Inject] private IJSRuntime JSRuntime { get; set; } = default!; [Inject] private NavigationManager NavigationManager { get; set; } = default!; private List DaysInMonth { get; set; } = new(); private List Shifts { get; set; } = new(); private Dictionary SelectedSchedule { get; set; } = new(); private int CurrentMonth { get; set; } private int CurrentYear { get; set; } protected override async Task OnInitializedAsync() { var (nextMonth, year) = GetNextMonthAndYear(); CurrentMonth = nextMonth; CurrentYear = year; DaysInMonth = Enumerable.Range(1, DateTime.DaysInMonth(year, nextMonth)) .Select(d => new DateTime(year, nextMonth, d)) .ToList(); Shifts = await HttpClient.GetFromJsonAsync>("api/shift/shifts") ?? new(); // Load saved schedule for this month await LoadScheduleFromStorage(); } private (int nextMonth, int year) GetNextMonthAndYear() { var today = DateTime.Today; var nextMonth = today.Month == 12 ? 1 : today.Month + 1; var year = today.Month == 12 ? today.Year + 1 : today.Year; return (nextMonth, year); } private async void SelectShift(DateTime day, string shiftName) { SelectedSchedule[day] = shiftName; await SaveScheduleToStorage(); } private async Task ExportToIcs() { var response = await HttpClient.PostAsJsonAsync("api/shift/export_ics", SelectedSchedule); var bytes = await response.Content.ReadAsByteArrayAsync(); var base64 = Convert.ToBase64String(bytes); var fileUrl = $"data:text/calendar;base64,{base64}"; NavigationManager.NavigateTo(fileUrl, true); } private async Task ExportToPdf() { var response = await HttpClient.PostAsJsonAsync("api/shift/export_pdf", SelectedSchedule); var bytes = await response.Content.ReadAsByteArrayAsync(); var base64 = Convert.ToBase64String(bytes); var fileUrl = $"data:application/octet-stream;base64,{base64}"; NavigationManager.NavigateTo(fileUrl, true); } private async Task SaveScheduleToStorage() { try { var storageKey = $"ShiftSchedule_{CurrentYear}_{CurrentMonth:D2}"; // Convert DateTime keys to string for JSON serialization var serializableSchedule = SelectedSchedule.ToDictionary( kvp => kvp.Key.ToString("yyyy-MM-dd"), kvp => kvp.Value ); var json = JsonSerializer.Serialize(serializableSchedule); await JSRuntime.InvokeVoidAsync("localStorage.setItem", storageKey, json); } catch (Exception) { // Silently fail if localStorage is not available } } private async Task LoadScheduleFromStorage() { try { var storageKey = $"ShiftSchedule_{CurrentYear}_{CurrentMonth:D2}"; var json = await JSRuntime.InvokeAsync("localStorage.getItem", storageKey); if (!string.IsNullOrEmpty(json)) { var serializableSchedule = JsonSerializer.Deserialize>(json); if (serializableSchedule != null) { // Convert string keys back to DateTime SelectedSchedule = serializableSchedule.ToDictionary( kvp => DateTime.Parse(kvp.Key), kvp => kvp.Value ); } } } catch (Exception) { // Silently fail if localStorage is not available or data is corrupted SelectedSchedule = new Dictionary(); } } } }