namespace NeonSprawl.Server.Game.Factions;
///
/// Persisted per-player faction standing keyed by (playerId, factionId) (NEO-135).
/// Missing row ⇒ neutral 0 at read. Consumed by ReputationOperations (NEO-136) and gate eval (NEO-137).
///
public interface IFactionStandingStore
{
/// Whether mutations for are allowed (dev bucket or Postgres player_position row).
bool CanWritePlayer(string playerId);
///
/// Reads standing for one faction. Missing row ⇒ 0 clamped to faction min/max.
/// Unknown faction id ⇒ structured deny with .
///
FactionStandingReadOutcome TryGetStanding(string playerId, string factionId);
///
/// Applies a signed delta, clamps resulting standing to faction min/max, and persists.
/// Does not append audit rows — is orchestrated by NEO-136.
///
FactionStandingMutationOutcome TryApplyStandingDelta(string playerId, string factionId, int deltaAmount);
///
/// Removes persisted standing for one faction (missing row reads as neutral 0).
/// Dev fixture / Bruno reset only — not for gameplay rollback.
///
bool TryClearStanding(string playerId, string factionId);
}