Networking/GameLibrary.cs
namespace Emulotl;

public static class GameLibrary
{
	private static readonly HashSet<string> WirelessAdapterGameCodes =
	[
		"BPR", // Pokémon FireRed
		"BPG", // Pokémon LeafGreen
		"BPE", // Pokémon Emerald
		// You can add more as needed through a PR, I'm too lazy to research any further
	];

	public static bool UsesWirelessAdapter( string gameCode )
	{
		if ( string.IsNullOrEmpty( gameCode ) || gameCode.Length < 3 )
			return false;

		return WirelessAdapterGameCodes.Contains( gameCode[..3] );
	}

	public static SessionMode DetectMode( string gameCode ) =>
		UsesWirelessAdapter( gameCode ) ? SessionMode.WirelessAdapter : SessionMode.LinkCable;

	public static GameEntry FindMatch( string sha1, string gameCode )
	{
		List<GameEntry> games;
		try { games = GameEntry.Discover(); }
		catch ( Exception e ) { Log.Warning( $"[Emulotl] GameEntry.Discover failed: {e.Message}" ); return null; }

		if ( !string.IsNullOrEmpty( sha1 ) )
		{
			foreach ( var game in games )
			{
				if ( string.Equals( ComputeSha1( game ), sha1, StringComparison.OrdinalIgnoreCase ) )
					return game;
			}
		}

		if ( !string.IsNullOrEmpty( gameCode ) )
			return games.FirstOrDefault( game => string.Equals( game.GameCode, gameCode, StringComparison.OrdinalIgnoreCase ) );

		return null;
	}

	public static string ComputeSha1( GameEntry game )
	{
		try
		{
			var bytes = game.FileSystem.ReadAllBytes( game.Path ).ToArray();
			return Convert.ToHexString( System.Security.Cryptography.SHA1.HashData( bytes ) );
		}
		catch
		{
			return string.Empty;
		}
	}
}