using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using Avalonia.Media;
using CommunityToolkit.Mvvm.ComponentModel;
using Elfisa.Core;
namespace Elfisa.Avalonia.ViewModels;
public partial class SettingsViewModel : ViewModelBase
{
private readonly ApiClient _api = new();
/// Пункт «По умолчанию» в списке шрифтов.
public const string DefaultFontLabel = "По умолчанию";
[ObservableProperty] private string _apiBaseUrl = "";
public string[] Themes { get; } = { "Светлая", "Тёмная" };
[ObservableProperty] private int _themeIndex;
/// Размер шрифта/текста — масштаб интерфейса.
public string[] FontSizes { get; } = { "Мелкий (90%)", "Обычный (100%)", "Крупный (115%)", "Очень крупный (130%)", "Огромный (150%)" };
private static readonly double[] ScaleValues = { 0.9, 1.0, 1.15, 1.3, 1.5 };
[ObservableProperty] private int _fontSizeIndex = 1;
public double SelectedScale => ScaleValues[Math.Clamp(FontSizeIndex, 0, ScaleValues.Length - 1)];
/// Все системные шрифты + «По умолчанию» первым.
public ObservableCollection Fonts { get; } = new();
[ObservableProperty] private string _selectedFont = DefaultFontLabel;
public ObservableCollection Locations { get; } = new();
[ObservableProperty] private BuyerLocationDto? _selectedLocation;
public SettingsViewModel()
{
_api.SetToken(Session.Current.Token);
ApiBaseUrl = SettingsStore.Current.ApiBaseUrl ?? AppConfig.DefaultApiBaseUrl;
ThemeIndex = SettingsStore.Current.Theme == "Dark" ? 1 : 0;
var scale = SettingsStore.Current.UiScale;
var best = 1;
for (int i = 0; i < ScaleValues.Length; i++)
if (Math.Abs(ScaleValues[i] - scale) < Math.Abs(ScaleValues[best] - scale)) best = i;
FontSizeIndex = best;
Fonts.Add(DefaultFontLabel);
foreach (var f in FontManager.Current.SystemFonts
.Select(x => x.Name)
.Where(n => !string.IsNullOrWhiteSpace(n))
.Distinct()
.OrderBy(n => n, StringComparer.CurrentCultureIgnoreCase))
Fonts.Add(f);
var saved = SettingsStore.Current.FontFamily;
SelectedFont = !string.IsNullOrWhiteSpace(saved) && Fonts.Contains(saved!)
? saved!
: DefaultFontLabel;
if (Session.Current.IsAuthenticated) _ = LoadLocationsAsync();
}
private async Task LoadLocationsAsync()
{
try
{
var locs = await _api.GetBuyerLocationsAsync();
Locations.Clear();
foreach (var l in locs) Locations.Add(l);
var savedId = SettingsStore.Current.DefaultLocationId;
SelectedLocation = Locations.FirstOrDefault(l => l.BuyerLocationId == savedId)
?? Locations.FirstOrDefault(l => l.IsDefault)
?? Locations.FirstOrDefault();
}
catch { /* локации не критичны для настроек */ }
}
}