from app.db import query from app import SYDNEY_TZ from datetime import datetime, timedelta def calculate_streak(user_id): """Calculate current and best consecutive-day check-in streaks.""" rows = query( """SELECT DISTINCT (checked_in_at AT TIME ZONE 'UTC' AT TIME ZONE 'Australia/Sydney')::date AS d FROM checkins WHERE user_id = %s ORDER BY d DESC""", (user_id,), ) if not rows: return {"current": 0, "best": 0} days = [r["d"] for r in rows] today = datetime.now(SYDNEY_TZ).date() # Current streak: must include today or yesterday to count current = 0 expected = today if days[0] == today or days[0] == today - timedelta(days=1): expected = days[0] for d in days: if d == expected: current += 1 expected -= timedelta(days=1) else: break # Best streak best = 1 run = 1 for i in range(1, len(days)): if days[i] == days[i - 1] - timedelta(days=1): run += 1 best = max(best, run) else: run = 1 best = max(best, current) return {"current": current, "best": best}