using Luski.Classes;

namespace Luski;

public static class LuskiExperiments
{
    public static List<ExperimentInfo> LuskiExperimentsList = new()
    {
        Parents.MainServer,
        Parents.ThemeEdit,
        new()
        {
            DisplayName = "Proper Label Size",
            Name = "2024_04_label_size",
            Options = new()
            {
                GUI.LiveLabelSize
            }
        },
        new()
        {
            DisplayName = "Rendering Sub Frames",
            Name = "2024_11_sub_frames",
            Options = new()
            {
                GUI.SubFrames
            }
        },
        new()
        {
            DisplayName = "Buffer Copying",
            Name = "2024_11_buffer_copying",
            Options = new()
            {
                GUI.BufferCopy
            }
        },
        new()
        {
            DisplayName = "Live View",
            Name = "2024_11_live_view",
            Options = new()
            {
                GUI.LiveViews
            }
        }
    };
    
    public static class Parents
    {
        public static ExperimentInfo MainServer = new()
        {
            DisplayName = "Main Servers",
            Name = "2023_12_main_servers",
            Options = new()
            {
                MainServers.EnableLuskiMainServers,
                MainServers.EnableMainServers,
            }
        };
        public static ExperimentInfo ThemeEdit = new()
        {
            DisplayName = "Theme Editor",
            Name = "2023_12_theme_edit",
            Options = new()
            {
                Settings.Theme,
            }
        };
    }
    
    public static class Settings
    {
        public static readonly ExperimentSelectorInfo Theme = new()
        {
            Name = "Appearance Tab",
            Description = "Adds a tab to edit the theme options.",
        };
    }
        
    public static class MainServers
    {
        public static readonly ExperimentSelectorInfo EnableMainServers = new()
        {
            Name = "Enable Main Servers",
            Description = "Will allow the Luski client to connect to all main servers.",
            RequiresRestart = true,
        };
        public static readonly ExperimentSelectorInfo EnableLuskiMainServers = new()
        {
            Name = "Enable Luski Main Servers",
            Description = "Will force the Luski client to connect to Luski main servers.",
            RequiresRestart = true,
        };
    }
    
    public static class GUI
    {
        public static readonly ExperimentSelectorInfo LiveLabelSize = new()
        {
            Name = "Proper Label Size",
            Description = "Live updates labels to be the right length during resize.", RequiresRestart = false
        };
        public static readonly ExperimentSelectorInfo SubFrames = new()
        {
            Name = "Sub Frames",
            Description = "Speeds up rendering controls by drawing to smaller area.", RequiresRestart = false
        };
        public static readonly ExperimentSelectorInfo BufferCopy = new()
        {
            Name = "Buffer Copy",
            Description = "Speeds up rendering controls during resize by copying from the GPU", RequiresRestart = false
        };
        public static readonly ExperimentSelectorInfo LiveViews = new()
        {
            Name = "Live Views",
            Description = "Speeds up rendering controls by checking in on GPU", RequiresRestart = false
        };
    }
}