using System;

using Avalonia.Controls;
using Avalonia.Markup.Xaml.Styling;
using Avalonia.PlatformSupport;
using Avalonia.Styling;
using Avalonia.UnitTests;

using BenchmarkDotNet.Attributes;

namespace Avalonia.Benchmarks.Themes
{
    [MemoryDiagnoser]
    public class ThemeBenchmark : IDisposable
    {
        private IDisposable _app;

        public ThemeBenchmark()
        {
            AssetLoader.RegisterResUriParsers();

            _app = UnitTestApplication.Start(TestServices.StyledWindow.With(theme: () => null));
            // Add empty style to override it later
            UnitTestApplication.Current.Styles.Add(new Style());
        }

        [Benchmark]
        [Arguments("avares://Avalonia.Themes.Fluent/FluentDark.xaml")]
        [Arguments("avares://Avalonia.Themes.Fluent/FluentLight.xaml")]
        public bool InitFluentTheme(string themeUri)
        {
            UnitTestApplication.Current.Styles[0] = new StyleInclude(new Uri("resm:Styles?assembly=Avalonia.Benchmarks"))
            {
                Source = new Uri(themeUri)
            };
            return ((IResourceHost)UnitTestApplication.Current).TryGetResource("SystemAccentColor", out _);
        }

        [Benchmark]
        [Arguments("avares://Avalonia.Themes.Default/Accents/BaseLight.xaml")]
        [Arguments("avares://Avalonia.Themes.Default/Accents/BaseDark.xaml")]
        public bool InitDefaultTheme(string themeUri)
        {
            UnitTestApplication.Current.Styles[0] = new Styles
            {
                new StyleInclude(new Uri("resm:Styles?assembly=Avalonia.Benchmarks"))
                {
                    Source = new Uri(themeUri)
                },
                new StyleInclude(new Uri("resm:Styles?assembly=Avalonia.Benchmarks"))
                {
                    Source = new Uri("avares://Avalonia.Themes.Default/DefaultTheme.xaml")
                }
            };
            return ((IResourceHost)UnitTestApplication.Current).TryGetResource("ThemeAccentColor", out _);
        }

        public void Dispose()
        {
            _app.Dispose();
        }
    }
}
