"""Fresh sample for the sealed fall rule. Keeps flags only, never comment text. Resumable.
Writes ~/data/hn-em-dash-fall/items.csv. Needs ~/data/hn-em-dash/{bounds.json,items.csv}."""
import concurrent.futures as cf, csv, importlib.util, json, os, random, sys, time
HERE = os.path.dirname(os.path.abspath(__file__))
def load(name, path):
    spec = importlib.util.spec_from_file_location(name, path)
    mod = importlib.util.module_from_spec(spec)
    sys.modules[name] = mod
    spec.loader.exec_module(mod)
    return mod
sys.path.insert(0, os.path.join(HERE, "..", "hn-em-dash"))
first = load("first_fetch", os.path.join(HERE, "..", "hn-em-dash", "fetch.py"))
rule = load("fall_rule", os.path.join(HERE, "rule.py"))
OUT = os.path.expanduser("~/data/hn-em-dash-fall")
OLD = os.path.expanduser("~/data/hn-em-dash")

def main():
    os.makedirs(OUT, exist_ok=True)
    edges = json.load(open(f"{OLD}/bounds.json"))
    every = sorted(k for k in edges if k != "end")
    with open(f"{OLD}/items.csv") as f:
        seen = {int(r["id"]) for r in csv.DictReader(f)}
    path = f"{OUT}/items.csv"
    new = not os.path.exists(path)
    if not new:
        with open(path) as f:
            seen |= {int(r["id"]) for r in csv.DictReader(f)}
    jobs = []
    for m in rule.months():
        k = every.index(m)
        hi = edges[every[k + 1]] if k + 1 < len(every) else edges["end"]
        jobs += [(i, m) for i in random.Random(f"{m}-fall-20261103").sample(range(edges[m], hi), 8000)
                 if i not in seen]
    with open(path, "a", newline="") as f, cf.ThreadPoolExecutor(8) as pool:
        w = csv.writer(f)
        if new:
            w.writerow(first.HEAD)
        for n, res in enumerate(pool.map(lambda j: first.row(*j), jobs)):
            w.writerow(res)
            if n % 500 == 0:
                f.flush()
                print(n, len(jobs), time.strftime("%H:%M:%S"), flush=True)
    print("done", len(jobs), time.strftime("%H:%M:%S"), flush=True)

if __name__ == "__main__":
    main()
