Emulation/SystemProfile.cs
namespace Emulotl;

public readonly struct ScreenSpec
{
	public readonly int Width;
	public readonly int Height;

	public ScreenSpec( int width, int height )
	{
		Width = width;
		Height = height;
	}
}

public enum DpadDirection
{
	None,
	Up,
	Down,
	Left,
	Right,
}

public readonly struct InputButton
{
	public readonly string Name;
	public readonly string ActionName;
	public readonly DpadDirection Dpad;

	public InputButton( string name, string actionName, DpadDirection dpad = DpadDirection.None )
	{
		Name = name;
		ActionName = actionName;
		Dpad = dpad;
	}
}

public sealed class SystemProfile
{
	public required string Id { get; init; }
	public required string DisplayName { get; init; }
	public required string[] RomExtensions { get; init; }
	public required ScreenSpec[] Screens { get; init; }
	public required int AudioSampleRate { get; init; }
	public int AudioChannels { get; init; } = 2;
	public required int AudioSamplesPerFrame { get; init; }
	public required double NativeFps { get; init; }
	public required int ClockRate { get; init; }
	public required int CyclesPerFrame { get; init; }
	public required InputButton[] Buttons { get; init; }
	public bool HasTouchscreen { get; init; }
	public int StateSlotCount { get; init; } = 4;
	public required string LibretroPlatform { get; init; }
	public required Func<byte[], string> ReadGameCode { get; init; }
	public required Func<IEmulatorCore> CreateCore { get; init; }
}