package ws

// Settler تسویه‌ی اقتصادی میز را انجام می‌دهد (پیاده‌سازی در لایه economy).
// لایه ws از جزئیات سکه/جایزه بی‌خبر است و فقط tier را پاس می‌دهد.
type Settler interface {
	ChargeEntry(userID int64, tier string) error // کسر ورودی هنگام ورود به صف
	Refund(userID int64, tier string)            // بازگرداندن ورودی در صورت لغو
	AwardWinner(userID int64, tier string)       // جایزه/XP/جام به برنده
	AwardRank(userID int64, tier string, won bool) // امتیازِ رتبه (میزِ رتبه‌بندی)
	RecordGame(room, playersJSON string, winnerTeam int, kot bool)
	// آمار پروفایل (همگی غیرحیاتی و fire-and-forget).
	RecordHand(userID int64, won, kot, asHakem bool) // پایان یک هَند
	RecordCut(userID int64)                          // بُرِش با حکم
	RecordGameResult(userID int64, won bool)         // پایان بازی (برد/باخت)
	// PlayerProfile سکه، نشانِ رتبه و seedِ آواتارِ بازیکن را برای نمایش سرِ میز برمی‌گرداند.
	PlayerProfile(userID int64) (coins int64, rankTier string, avatar string)
	// ChargeTicket یک بلیت برای بُرِ مجدد در فازِ انتخابِ حکم مصرف می‌کند.
	ChargeTicket(userID int64) error
	// ChargeCoins/AwardCoins برای شرطِ سکه‌ایِ میزِ خصوصی (pot). Charge در صورتِ
	// کمبودِ موجودی خطا می‌دهد؛ Award سکه را به برنده اضافه می‌کند.
	ChargeCoins(userID int64, amount int64, ref string) error
	AwardCoins(userID int64, amount int64, ref string)
	// میز خصوصی (دورهمی).
	ChargePrivateTable(userID int64) error                   // مصرفِ یک میز رایگان (خطا اگر سقف پر باشد)
	PrivateTableInfo(userID int64) (remaining int, unlimited bool)
	// TargetHands تعداد هَندِ لازم برای برد بازی در این tier (مثلاً مبتدی=۳).
	TargetHands(tier string) int
}

// noopSettler پیش‌فرض (برای تست‌ها و حالت بدون اقتصاد).
type noopSettler struct{}

func (noopSettler) ChargeEntry(int64, string) error      { return nil }
func (noopSettler) Refund(int64, string)                 {}
func (noopSettler) AwardWinner(int64, string)            {}
func (noopSettler) AwardRank(int64, string, bool)        {}
func (noopSettler) RecordGame(string, string, int, bool) {}
func (noopSettler) RecordHand(int64, bool, bool, bool)   {}
func (noopSettler) RecordCut(int64)                      {}
func (noopSettler) RecordGameResult(int64, bool)         {}
func (noopSettler) PlayerProfile(int64) (int64, string, string) { return 0, "", "" }
func (noopSettler) ChargeTicket(int64) error             { return nil }
func (noopSettler) ChargeCoins(int64, int64, string) error { return nil }
func (noopSettler) AwardCoins(int64, int64, string)        {}
func (noopSettler) ChargePrivateTable(int64) error       { return nil }
func (noopSettler) PrivateTableInfo(int64) (int, bool)   { return 0, true }
func (noopSettler) TargetHands(string) int               { return 7 }
