#!/usr/bin/env python3
"""Fetch 3 months of WooCommerce orders from Nitrous Competitions.
Uses day-by-day date windows with concurrent requests to keep WP fast.
"""
import os, sys, json, time, requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime, timedelta

CK = "ck_2d5b57b00e4fc0024db774929e147f86684e0add"
CS = "cs_1850818e2e325cfb4959749cd95c405d91d8226b"
BASE = "https://www.nitrouscompetitions.com/wp-json/wc/v3/orders"
AUTH = (CK, CS)
PER = 100
STATUS = "completed"
OUT = "/home/sol1/Desktop/MARKETING/nitrous_3mo/raw"
os.makedirs(OUT, exist_ok=True)

START = datetime(2026, 2, 6)
END   = datetime(2026, 5, 6, 23, 59, 59)

def get(params, retries=4):
    for i in range(retries):
        try:
            r = requests.get(BASE, auth=AUTH, params=params, timeout=60)
            if r.status_code == 200:
                return r
            time.sleep(1 + i)
        except Exception as e:
            time.sleep(1 + i)
    r.raise_for_status()
    return r

def fetch_day(day):
    """Fetch every page for a single day. Returns (day, n_orders)."""
    after  = day.strftime("%Y-%m-%dT00:00:00")
    before = day.strftime("%Y-%m-%dT23:59:59")
    fname = os.path.join(OUT, day.strftime("%Y-%m-%d.json"))
    if os.path.exists(fname) and os.path.getsize(fname) > 50:
        try:
            with open(fname) as f:
                data = json.load(f)
            return (day, len(data), True)
        except Exception:
            pass
    # Page 1 -> get total count
    r = get({"per_page": PER, "status": STATUS, "after": after, "before": before, "page": 1, "orderby": "date", "order": "asc"})
    total_pages = int(r.headers.get("x-wp-totalpages", 1))
    total = int(r.headers.get("x-wp-total", 0))
    all_orders = list(r.json())
    for p in range(2, total_pages + 1):
        rp = get({"per_page": PER, "status": STATUS, "after": after, "before": before, "page": p, "orderby": "date", "order": "asc"})
        all_orders.extend(rp.json())
    with open(fname, "w") as f:
        json.dump(all_orders, f)
    return (day, len(all_orders), False)

days = []
d = START
while d <= END:
    days.append(d)
    d += timedelta(days=1)

print(f"Fetching {len(days)} days from {START.date()} to {END.date()}", flush=True)
done = 0
total_orders = 0
with ThreadPoolExecutor(max_workers=6) as ex:
    futs = {ex.submit(fetch_day, day): day for day in days}
    for f in as_completed(futs):
        day, n, cached = f.result()
        done += 1
        total_orders += n
        tag = "cached" if cached else "fetched"
        print(f"[{done}/{len(days)}] {day.date()} {tag} {n} orders (running total: {total_orders})", flush=True)

print(f"DONE: {total_orders} orders saved to {OUT}/")
