package economy

import (
	"context"
	"errors"
)

// FreePrivateTables سقفِ میزهای خصوصیِ رایگان برای کاربرِ غیر VIP.
const FreePrivateTables = 5

// ErrTableLimit وقتی کاربرِ غیر VIP به سقفِ میزهای رایگان رسیده باشد.
var ErrTableLimit = errors.New("free private table limit reached")

// PrivateTableInfo باقیمانده‌ی میزهای رایگان و نامحدود بودن (VIP) را برمی‌گرداند.
func (s *Service) PrivateTableInfo(ctx context.Context, userID int64) (remaining int, unlimited bool) {
	if s.isVIP(ctx, userID) {
		return 0, true
	}
	var used int
	_ = s.db.QueryRowContext(ctx, `SELECT free_tables_used FROM users WHERE id = ?`, userID).Scan(&used)
	rem := FreePrivateTables - used
	if rem < 0 {
		rem = 0
	}
	return rem, false
}

// ConsumePrivateTable در صورت مجاز بودن، یک میز خصوصی را برای کاربر مصرف می‌کند.
// برای VIP بدون محدودیت است؛ برای غیر VIP در صورت اتمامِ سقف خطا می‌دهد.
func (s *Service) ConsumePrivateTable(ctx context.Context, userID int64) error {
	if s.isVIP(ctx, userID) {
		return nil
	}
	res, err := s.db.ExecContext(ctx,
		`UPDATE users SET free_tables_used = free_tables_used + 1
		 WHERE id = ? AND free_tables_used < ?`, userID, FreePrivateTables)
	if err != nil {
		return err
	}
	if n, _ := res.RowsAffected(); n == 0 {
		return ErrTableLimit
	}
	return nil
}
