"""
StashGamma EOD Data API — Python quickstart.

    pip install -r requirements.txt
    export STASHGAMMA_API_KEY=sg_live_...
    python eod_quickstart.py QQQ 2026-07-01 2026-08-01

Docs: https://www.stashgamma.com/developer-docs
"""
import os
import sys
import time

import requests

BASE_URL = "https://www.stashgamma.com/api/dataapi/v1"


def get_eod_bars(symbol: str, date_from: str | None = None, date_to: str | None = None,
                  api_key: str | None = None, max_retries: int = 3) -> list[dict]:
    """Fetch daily OHLCV bars for `symbol`, retrying once on a 429 using Retry-After."""
    api_key = api_key or os.environ["STASHGAMMA_API_KEY"]
    params = {k: v for k, v in {"from": date_from, "to": date_to}.items() if v}

    for attempt in range(max_retries + 1):
        resp = requests.get(
            f"{BASE_URL}/eod/{symbol}",
            params=params,
            headers={"X-Api-Key": api_key},
            timeout=10,
        )

        if resp.status_code == 429 and attempt < max_retries:
            retry_after = int(resp.headers.get("Retry-After", "5"))
            print(f"Rate limited, retrying in {retry_after}s "
                  f"({resp.headers.get('X-RateLimit-Remaining-Hour', '?')} left this hour)...",
                  file=sys.stderr)
            time.sleep(retry_after)
            continue

        resp.raise_for_status()  # raises for 400/401/404/5xx
        return resp.json()["bars"]

    raise RuntimeError(f"Still rate-limited after {max_retries} retries")


if __name__ == "__main__":
    symbol = sys.argv[1] if len(sys.argv) > 1 else "QQQ"
    date_from = sys.argv[2] if len(sys.argv) > 2 else "2026-07-01"
    date_to = sys.argv[3] if len(sys.argv) > 3 else "2026-08-01"

    bars = get_eod_bars(symbol, date_from, date_to)
    print(f"{symbol}: {len(bars)} bars")
    for bar in bars[:5]:
        print(bar)
