using MudBlazor;

namespace WebClientTpos.Client.Services;

/// <summary>
/// EN: Theme state service — allows layouts to switch the MudBlazor theme and dark mode
///     without re-declaring MudThemeProvider in every layout (FRONT-W-06).
///     App.razor hosts a single MudThemeProvider bound to this service.
/// VI: Service trạng thái theme — cho phép layout chuyển đổi theme và dark mode MudBlazor
///     mà không khai báo lại MudThemeProvider ở mỗi layout (FRONT-W-06).
///     App.razor host một MudThemeProvider duy nhất gắn với service này.
/// </summary>
public class ThemeStateService
{
    /// <summary>
    /// EN: Current MudBlazor theme. Defaults to DefaultDark.
    /// VI: Theme MudBlazor hiện tại. Mặc định là DefaultDark.
    /// </summary>
    public MudTheme CurrentTheme { get; private set; } = AppTheme.DefaultDark;

    /// <summary>
    /// EN: Whether dark mode is active. Defaults to true.
    /// VI: Dark mode có đang bật không. Mặc định là true.
    /// </summary>
    public bool IsDarkMode { get; private set; } = true;

    /// <summary>
    /// EN: Raised whenever theme or dark mode changes so subscribers can re-render.
    /// VI: Được kích hoạt khi theme hoặc dark mode thay đổi để subscriber re-render.
    /// </summary>
    public event Action? OnChange;

    /// <summary>
    /// EN: Set theme and dark mode. Called by each layout on initialization.
    /// VI: Đặt theme và dark mode. Được gọi bởi mỗi layout khi khởi tạo.
    /// </summary>
    public void SetTheme(MudTheme theme, bool isDarkMode = true)
    {
        CurrentTheme = theme;
        IsDarkMode = isDarkMode;
        OnChange?.Invoke();
    }

    /// <summary>
    /// EN: Restore default dark theme. Called by non-default layouts on dispose.
    /// VI: Khôi phục theme tối mặc định. Được gọi bởi layout không mặc định khi dispose.
    /// </summary>
    public void RestoreDefault() => SetTheme(AppTheme.DefaultDark, isDarkMode: true);
}
