"""Reproduce an illustrative workload model, not a scheduler prediction."""
import csv
from pathlib import Path

DAYS = 28
FOLLOWUP_OFFSETS = (1, 3, 7, 14)
NEW_SECONDS = 60
REVIEW_SECONDS = 20
RATES = (5, 10, 20)


def workload(rate, day):
    """Count one later attempt per eligible cohort and chosen offset."""
    reviews = rate * sum(day - offset >= 1 for offset in FOLLOWUP_OFFSETS)
    seconds = rate * NEW_SECONDS + reviews * REVIEW_SECONDS
    return reviews, seconds


# Default-example checks are separate from configurable scenario invariants.
if (FOLLOWUP_OFFSETS, NEW_SECONDS, REVIEW_SECONDS) == ((1, 3, 7, 14), 60, 20):
    assert workload(10, 1) == (0, 600)
    assert workload(10, 2) == (10, 800)
    assert workload(10, 4) == (20, 1000)
    assert workload(10, 8) == (30, 1200)
    assert workload(10, 15) == (40, 1400)
    assert workload(20, 28) == (80, 2800)
    assert workload(5, 28) == (20, 700)
assert DAYS > 0 and NEW_SECONDS >= 0 and REVIEW_SECONDS >= 0
assert len(set(FOLLOWUP_OFFSETS)) == len(FOLLOWUP_OFFSETS)
assert all(offset > 0 for offset in FOLLOWUP_OFFSETS)
assert all(rate >= 0 for rate in RATES)
for rate in RATES:
    total_reviews = sum(workload(rate, day)[0] for day in range(1, DAYS + 1))
    assert total_reviews == rate * sum(max(0, DAYS - offset) for offset in FOLLOWUP_OFFSETS)

out = Path(__file__).with_name("illustrative-workload.csv")
with out.open("w", newline="", encoding="utf-8") as stream:
    writer = csv.writer(stream)
    writer.writerow(["new_cards_per_day", "day", "new_cards", "later_attempts", "total_seconds", "total_minutes"])
    for rate in RATES:
        for day in range(1, DAYS + 1):
            reviews, seconds = workload(rate, day)
            writer.writerow([rate, day, rate, reviews, seconds, f"{seconds / 60:.2f}"])
print(f"PASS: cohort totals; wrote {DAYS * len(RATES)} illustrative rows")
