// ReSharper disable RedundantUsingDirective
// ReSharper disable RedundantNullableDirective

using System.Collections.Generic;

#nullable enable

namespace Snerble.VRC.OSCLink.Unity
{
	public class MenuDescriptor
	{
		public List<Menu> Menus { get; set; } = null!;
		public List<MenuResource> Resources { get; set; } = null!;
	}

	public class Menu : IMenu<MenuControl>
	{
		public string Id { get; set; } = "";
        public List<MenuControl>? Controls { get; set; }
		IReadOnlyList<MenuControl>? IMenu<MenuControl>.Controls => Controls;
	}

	public class MenuControl : IMenuControl
	{
		public string Name { get; set; } = "";
		public MenuControlType Type { get; set; }
		public string? Icon { get; set; }
		public string? SubMenu { get; set; }

		public string? Parameter { get; set; }
		public float? Value { get; set; }
		
		public List<string?>? SubParameters { get; set; }
		public List<MenuControlLabel?>? Labels { get; set; }
	}

	public class MenuControlLabel
	{
		public string? Icon { get; set; }
		public string? Label { get; set; }

		public bool IsEmpty() => string.IsNullOrEmpty(Label) || string.IsNullOrEmpty(Icon);
	}

	public interface IMenu<out T> where T : IMenuControl
	{
		string Id { get; }
		IReadOnlyList<T>? Controls { get; }
	}

	public interface IMenuControl
	{
		string Name { get; }
	}

	public enum MenuControlType
	{
		Button,
		Toggle,
		Radial,
		TwoAxis,
		FourAxis,
		Folder
	}

	public class MenuResource
	{
		public string Id { get; set; } = "";
		public string MimeType { get; set; } = "";
		public string Data { get; set; } = null!;
	}
}