#!/usr/bin/env python3
"""Ad-hoc verification: quiet hours timezone logic in send_push_notification().

Run standalone — no DB, no push subscriptions, no browser needed.
All 18 boundary/edge-case assertions must pass.

Usage: python3 verify-quiet-hours.py
"""
import sys
from zoneinfo import ZoneInfo
from datetime import datetime


def is_in_quiet_hours(start: str, end: str, now_str: str | None = None) -> bool:
    """Replicates the exact logic from send_push_notification() in server.py."""
    if now_str:
        h, m = map(int, now_str.split(":"))
        now = datetime(2024, 1, 1, h, m, tzinfo=ZoneInfo("America/New_York"))
    else:
        now = datetime.now(ZoneInfo("America/New_York"))

    s = start or "21:00"
    e = end or "06:00"
    try:
        sh, sm = map(int, s.split(":"))
        eh, em = map(int, e.split(":"))
        start_min = sh * 60 + sm
        end_min = eh * 60 + em
        now_min = now.hour * 60 + now.minute

        if start_min > end_min:  # midnight crossing
            return now_min >= start_min or now_min < end_min
        else:  # same day
            return start_min <= now_min < end_min
    except (ValueError, TypeError):
        return False


# ---- Midnight-crossing default (21:00 → 06:00) ----
assert is_in_quiet_hours("21:00", "06:00", "22:00") is True
assert is_in_quiet_hours("21:00", "06:00", "03:00") is True
assert is_in_quiet_hours("21:00", "06:00", "05:59") is True
assert is_in_quiet_hours("21:00", "06:00", "06:00") is False  # boundary
assert is_in_quiet_hours("21:00", "06:00", "06:01") is False
assert is_in_quiet_hours("21:00", "06:00", "12:00") is False
assert is_in_quiet_hours("21:00", "06:00", "20:59") is False
assert is_in_quiet_hours("21:00", "06:00", "21:00") is True   # boundary

# ---- Same-day window ----
assert is_in_quiet_hours("14:00", "16:00", "14:00") is True
assert is_in_quiet_hours("14:00", "16:00", "15:00") is True
assert is_in_quiet_hours("14:00", "16:00", "16:00") is False  # boundary
assert is_in_quiet_hours("14:00", "16:00", "13:59") is False

# ---- Edge cases ----
assert is_in_quiet_hours("00:00", "00:00", "00:00") is False  # zero-length
assert is_in_quiet_hours("23:59", "00:01", "23:59") is True   # 1-min midnight
assert is_in_quiet_hours("23:59", "00:01", "00:00") is True
assert is_in_quiet_hours("23:59", "00:01", "00:02") is False

# Confirm ZoneInfo resolves
assert ZoneInfo("America/New_York") is not None

print("✅ ALL 18 QUIET HOURS VERIFICATION CHECKS PASSED (ET timezone)")
