using System.Globalization; using ClaudeDo.Ui.Services; using CommunityToolkit.Mvvm.ComponentModel; namespace ClaudeDo.Ui.ViewModels.Modals.Settings; public sealed partial class PrimeScheduleRowViewModel : ViewModelBase { private const int Mon = 1, Tue = 2, Wed = 4, Thu = 8, Fri = 16, Sat = 32, Sun = 64; public Guid Id { get; } public bool IsExisting { get; } [ObservableProperty] private bool _enabled; [ObservableProperty] private bool _monday; [ObservableProperty] private bool _tuesday; [ObservableProperty] private bool _wednesday; [ObservableProperty] private bool _thursday; [ObservableProperty] private bool _friday; [ObservableProperty] private bool _saturday; [ObservableProperty] private bool _sunday; [ObservableProperty] private TimeSpan _timeOfDay; [ObservableProperty] private DateTimeOffset? _lastRunAt; public string LastRunLabel => LastRunAt is { } v ? v.LocalDateTime.ToString("g") : "—"; private static readonly string[] TimeFormats = { @"h\:mm", @"hh\:mm" }; public string TimeText { get => TimeOfDay.ToString(@"hh\:mm", CultureInfo.InvariantCulture); set { if (TimeSpan.TryParseExact(value, TimeFormats, CultureInfo.InvariantCulture, out var t) && t >= TimeSpan.Zero && t < TimeSpan.FromDays(1)) { TimeOfDay = t; } OnPropertyChanged(nameof(TimeText)); } } partial void OnLastRunAtChanged(DateTimeOffset? value) => OnPropertyChanged(nameof(LastRunLabel)); partial void OnTimeOfDayChanged(TimeSpan value) => OnPropertyChanged(nameof(TimeText)); public PrimeScheduleRowViewModel(PrimeScheduleDto dto, bool isExisting) { Id = dto.Id; IsExisting = isExisting; Enabled = dto.Enabled; Monday = (dto.Days & Mon) != 0; Tuesday = (dto.Days & Tue) != 0; Wednesday = (dto.Days & Wed) != 0; Thursday = (dto.Days & Thu) != 0; Friday = (dto.Days & Fri) != 0; Saturday = (dto.Days & Sat) != 0; Sunday = (dto.Days & Sun) != 0; TimeOfDay = dto.TimeOfDay; LastRunAt = dto.LastRunAt; } public int DaysMask() { int m = 0; if (Monday) m |= Mon; if (Tuesday) m |= Tue; if (Wednesday) m |= Wed; if (Thursday) m |= Thu; if (Friday) m |= Fri; if (Saturday) m |= Sat; if (Sunday) m |= Sun; return m; } public PrimeScheduleDto ToDto() => new(Id, DaysMask(), TimeOfDay, Enabled, LastRunAt, null); }