using FrontOffice.Main.Utilities; using Microsoft.AspNetCore.Components; using MudBlazor; namespace FrontOffice.Main.Shared; public partial class WeekSelector : ComponentBase { [Inject] private CommissionService CommissionService { get; set; } = default!; /// /// Selected week definition /// [Parameter] public WeekDefinitionDto? Value { get; set; } /// /// Callback when week selection changes /// [Parameter] public EventCallback ValueChanged { get; set; } /// /// Label for the input /// [Parameter] public string Label { get; set; } = "انتخاب هفته"; /// /// Placeholder text /// [Parameter] public string Placeholder { get; set; } = "هفته را انتخاب کنید..."; /// /// Input variant /// [Parameter] public Variant Variant { get; set; } = Variant.Outlined; /// /// Dense mode /// [Parameter] public bool Dense { get; set; } = false; /// /// Input margin /// [Parameter] public Margin Margin { get; set; } = Margin.Normal; /// /// Allow clearing the selection /// [Parameter] public bool Clearable { get; set; } = true; /// /// CSS class /// [Parameter] public string? Class { get; set; } /// /// Inline style /// [Parameter] public string? Style { get; set; } /// /// Persian year filter /// [Parameter] public int? PersianYear { get; set; } /// /// Gregorian year filter /// [Parameter] public int? GregorianYear { get; set; } /// /// Only show active weeks /// [Parameter] public bool? OnlyActive { get; set; } = true; private WeekDefinitionDto? _selectedWeek { get => Value; set { if (Value != value) { Value = value; ValueChanged.InvokeAsync(value); } } } private List _cachedWeeks = new(); private bool _isLoading = false; protected override async Task OnInitializedAsync() { // Pre-load weeks await LoadWeeksAsync(); } private async Task LoadWeeksAsync() { try { _isLoading = true; _cachedWeeks = await CommissionService.GetWeekDefinitionsAsync( searchText: null, gregorianYear: GregorianYear, persianYear: PersianYear, isActive: OnlyActive, pageSize: 100 ); } catch { _cachedWeeks = new List(); } finally { _isLoading = false; } } private async Task> SearchWeeksAsync(string searchText, CancellationToken cancellationToken) { // If cached weeks are empty, load them if (!_cachedWeeks.Any()) { await LoadWeeksAsync(); } // Filter locally from cache if (string.IsNullOrWhiteSpace(searchText)) return _cachedWeeks; return _cachedWeeks.Where(w => w.DisplayName.Contains(searchText, StringComparison.OrdinalIgnoreCase) || w.StartDatePersian.Contains(searchText, StringComparison.OrdinalIgnoreCase) || w.EndDatePersian.Contains(searchText, StringComparison.OrdinalIgnoreCase)); } private async Task OnWeekChanged(WeekDefinitionDto? week) { _selectedWeek = week; } /// /// Get current week from cached weeks /// public WeekDefinitionDto? GetCurrentWeek() { return _cachedWeeks.FirstOrDefault(w => w.IsCurrentWeek); } /// /// Select current week /// public async Task SelectCurrentWeekAsync() { var currentWeek = GetCurrentWeek(); if (currentWeek != null) { _selectedWeek = currentWeek; StateHasChanged(); } await Task.CompletedTask; } /// /// Find week by WeekOrder number (e.g., 46 from ?week=46) /// public WeekDefinitionDto? FindByWeekOrder(int weekOrder) { return _cachedWeeks.FirstOrDefault(w => w.WeekOrder == weekOrder); } /// /// Find week by Id /// public WeekDefinitionDto? FindById(long id) { return _cachedWeeks.FirstOrDefault(w => w.Id == id); } /// /// Select week by WeekOrder /// public async Task SelectByWeekOrderAsync(int weekOrder) { var week = FindByWeekOrder(weekOrder); if (week != null) { _selectedWeek = week; StateHasChanged(); } await Task.CompletedTask; } /// /// Ensure weeks are loaded (useful for parent components) /// public async Task EnsureLoadedAsync() { if (!_cachedWeeks.Any()) { await LoadWeeksAsync(); } } /// /// Get all cached weeks /// public IReadOnlyList GetCachedWeeks() => _cachedWeeks.AsReadOnly(); }