Ems/EmsBackend.cs

Client-side helpers for the EMS backend. Defines response models for staff sync and medical bills, and wraps the MdtPost calls serverEmsSync, serverEmsRoster, serverEmsBill, serverEmsBills and serverEmsBillPay.

Http Calls
namespace HorizonRP;

/// <summary>
/// Les appels de l'API des secours (UCFD EMS) : effectifs, factures de soins. Clé du serveur,
/// appelés par l'hôte seul (Police/PoliceService.Ems.cs, Ems/EmsActions.cs) après avoir revérifié
/// les droits. Par l'envoi de la tablette (MdtPost) : il lit aussi les réponses 4xx, dont le
/// message en français (« Solde insuffisant… ») doit arriver au joueur.
/// </summary>
public static partial class Backend
{
	/// <summary>Un secouriste inscrit, tel que serverEmsSync le rend.</summary>
	public sealed class EmsStaffMember
	{
		public object SteamId { get; set; }
		public string SteamIdText => SteamId?.ToString()?.Trim( '"' );
		public string RpName { get; set; }
		public int Grade { get; set; }
		public string Badge { get; set; }
		public string Callsign { get; set; }
	}

	public sealed class EmsSyncResponse
	{
		public bool Ok { get; set; }
		public string Error { get; set; }
		public List<EmsStaffMember> Staff { get; set; }
	}

	/// <summary>Une facture de soins (hz_medical_bills).</summary>
	public sealed class EmsBill
	{
		public long Id { get; set; }
		public int Amount { get; set; }
		public string Status { get; set; }
		public string Title { get; set; }
		public string IssuedBy { get; set; }
		public string IssuedAt { get; set; }
		public string PaidAt { get; set; }

		public bool Unpaid => Status == "impayee";
	}

	public sealed class EmsBillsResponse
	{
		public bool Ok { get; set; }
		public string Error { get; set; }
		public List<EmsBill> Bills { get; set; }
	}

	public sealed class EmsBillResponse
	{
		public bool Ok { get; set; }
		public string Error { get; set; }
		public long BillId { get; set; }
		public int Amount { get; set; }
		public string Title { get; set; }
		/// <summary>Réglée sur place (payNow) : le solde HZ BANK après paiement, sinon null.</summary>
		public int? Bank { get; set; }
	}

	public sealed class EmsBillPayResponse
	{
		public bool Ok { get; set; }
		public string Error { get; set; }
		public int Bank { get; set; }
		public long BillId { get; set; }
		public int Amount { get; set; }
	}

	public static Task<EmsSyncResponse> EmsSync()
		=> MdtPost<EmsSyncResponse>( "serverEmsSync", new { } );

	/// <summary>Effectifs en jeu : <paramref name="grade"/> null = renvoi.</summary>
	public static Task<SimpleResponse> EmsRoster( ulong steamId, int? grade, string callsign, string by, int byGrade )
		=> MdtPost<SimpleResponse>( "serverEmsRoster", new { steamId = steamId.ToString(), grade, callsign, by, byGrade } );

	/// <summary>
	/// Une facture de soins (ids de EmsRules.Tariffs ; le montant est recalculé par l'API). Avec
	/// <paramref name="payNow"/> (l'accueil), réglée aussitôt depuis <paramref name="balance"/>.
	/// </summary>
	public static Task<EmsBillResponse> EmsBillCreate( ulong steamId, List<string> items, string notes, string by, ulong bySteam, bool payNow = false, int balance = 0 )
		=> MdtPost<EmsBillResponse>( "serverEmsBill", new { steamId = steamId.ToString(), items, notes, by, bySteam = bySteam == 0 ? null : bySteam.ToString(), payNow, balance } );

	public static Task<EmsBillsResponse> EmsBills( ulong steamId )
		=> MdtPost<EmsBillsResponse>( "serverEmsBills", new { steamId = steamId.ToString() } );

	/// <summary><paramref name="balance"/> : le solde que le jeu a en mémoire (il fait foi).</summary>
	public static Task<EmsBillPayResponse> EmsBillPay( ulong steamId, long billId, int balance )
		=> MdtPost<EmsBillPayResponse>( "serverEmsBillPay", new { steamId = steamId.ToString(), billId, balance } );
}