Editor/Road/ArchRoadCatalogs.cs
namespace Sunless.Architecture;

public static class ArchRoadCatalogs {
	static string BridgeDirectory => ArchDataRoot.For( "bridges" );
	static string TunnelDirectory => ArchDataRoot.For( "tunnels" );

	public static List<ArchBridgeType> Bridges() {
		foreach ( var built in ArchBridgeTypes.Defaults() ) {
			var path = BridgePath( built.Name );

			if ( !ArchStorage.DocumentExists( path ) ) {
				ArchStorage.WriteDocument( path, built );
			}
		}

		return ArchStorage.DocumentFiles( BridgeDirectory, ".bridgetype.json" )
			.Select( file => ArchStorage.ReadDocument<ArchBridgeType>( $"{BridgeDirectory}/{file}" ) )
			.Where( type => type is { Name.Length: > 0, Deck: not null } )
			.OrderBy( type => type.Title )
			.ToList();
	}

	public static ArchBridgeType Bridge( string name ) {
		return Bridges().FirstOrDefault( type => string.Equals( type.Name, name, StringComparison.OrdinalIgnoreCase ) );
	}

	public static List<ArchTunnelType> Tunnels() {
		foreach ( var built in ArchTunnelTypes.Defaults() ) {
			var path = TunnelPath( built.Name );

			if ( !ArchStorage.DocumentExists( path ) ) {
				ArchStorage.WriteDocument( path, built );
			}
		}

		return ArchStorage.DocumentFiles( TunnelDirectory, ".tunneltype.json" )
			.Select( file => ArchStorage.ReadDocument<ArchTunnelType>( $"{TunnelDirectory}/{file}" ) )
			.Where( type => type is { Name.Length: > 0, Bore: not null } )
			.OrderBy( type => type.Title )
			.ToList();
	}

	public static ArchTunnelType Tunnel( string name ) {
		return Tunnels().FirstOrDefault( type => string.Equals( type.Name, name, StringComparison.OrdinalIgnoreCase ) );
	}

	public static string BridgeDirectoryPath => BridgeDirectory;

	public static string TunnelDirectoryPath => TunnelDirectory;

	static string BridgePath( string name ) => $"{BridgeDirectory}/{name}.bridgetype.json";

	static string TunnelPath( string name ) => $"{TunnelDirectory}/{name}.tunneltype.json";
}