Editor/Decompiler/Formats/Descriptors/CounterStrikeGlobalOffensiveBspFormatDescriptor.cs
using BspImport.Decompiler.Formats.Readers;

namespace BspImport.Decompiler.Formats.Descriptors;

public sealed class CounterStrikeGlobalOffensiveBspFormatDescriptor : IBspFormatDescriptor
{
	private static readonly IBspStructReaders _readers = new StandardBspStructReaders();

	private static readonly HashSet<string> Signatures = new( StringComparer.OrdinalIgnoreCase )
	{
		"cs_gamerules",
		"dangerzone_controller",
		"flashbang_projectile",
		"func_bomb_target",
		"func_buyzone",
		"func_hostage_rescue",
		"func_no_defuse",
		"hostage_entity",
		"info_deathmatch_spawn",
		"info_hostage_spawn",
		"info_player_counterterrorist",
		"info_player_terrorist",
		"planted_c4_training"
	};

	public BspGameFormat GameFormat => BspGameFormat.CounterStrikeGlobalOffensive;
	public IReadOnlySet<int> SupportedVersions { get; } = new HashSet<int> { 21 };
	public string DisplayName => "Counter-Strike: Global Offensive BSP";
	public int SpecificityScore => 100;

	public LumpHeaderLayout LumpHeaderLayout => LumpHeaderLayout.Standard;
	public BrushSideLayout BrushSideLayout => BrushSideLayout.Standard;
	public StaticPropLayout StaticPropLayout => StaticPropLayout.V11;

	public IBspStructReaders GetStructReaders( int bspVersion ) => _readers;

	public bool MatchesMapName( string mapName ) => mapName.StartsWith( "de_", StringComparison.OrdinalIgnoreCase )
	                                                || mapName.StartsWith( "cs_", StringComparison.OrdinalIgnoreCase )
	                                                || mapName.StartsWith( "aim_", StringComparison.OrdinalIgnoreCase )
	                                                || mapName.StartsWith( "ar_", StringComparison.OrdinalIgnoreCase );

	public bool MatchesEntities( IReadOnlyList<string> entityClassNames )
	{
		return Signatures.Overlaps( entityClassNames );
	}
}