// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Microsoft.CmdPal.Ext.WindowsSettings.Helpers;
using Microsoft.CmdPal.Ext.WindowsSettings.Pages;
using Microsoft.CmdPal.Ext.WindowsSettings.Properties;
using Microsoft.CommandPalette.Extensions;
using Microsoft.CommandPalette.Extensions.Toolkit;

namespace Microsoft.CmdPal.Ext.WindowsSettings;

public sealed partial class WindowsSettingsCommandsProvider : CommandProvider
{
    private readonly CommandItem _searchSettingsListItem;

#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
    private readonly WindowsSettings.Classes.WindowsSettings? _windowsSettings;
#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.

    private readonly FallbackWindowsSettingsItem _fallback;

    public WindowsSettingsCommandsProvider()
    {
        Id = "com.microsoft.cmdpal.builtin.windowssettings";
        DisplayName = Resources.WindowsSettingsProvider_DisplayName;
        Icon = Icons.WindowsSettingsIcon;

        _windowsSettings = JsonSettingsListHelper.ReadAllPossibleSettings();
        _searchSettingsListItem = new CommandItem(new WindowsSettingsListPage(_windowsSettings))
        {
            Title = Resources.settings_title,
        };
        _fallback = new(_windowsSettings);

        UnsupportedSettingsHelper.FilterByBuild(_windowsSettings);

        TranslationHelper.TranslateAllSettings(_windowsSettings);
        WindowsSettingsPathHelper.GenerateSettingsPathValues(_windowsSettings);
    }

    public override ICommandItem[] TopLevelCommands()
    {
        return [
            _searchSettingsListItem
        ];
    }

    public override IFallbackCommandItem[] FallbackCommands() => [_fallback];
}
