"""Path setup shared by all scripts in code/: makes the run root the working
directory, puts the workspace-local dependency directory (.pydeps) and code/
on sys.path, and provides small provenance helpers."""
import datetime
import hashlib
import json
import os
import resource
import sys
import time

ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(ROOT, ".pydeps"))
sys.path.insert(0, os.path.join(ROOT, "code"))
os.chdir(ROOT)

RESULTS = os.path.join(ROOT, "results")
# AUTOSCHOLAR_CERTS_DIR lets reproduce.sh write regenerated certificates next to, not over, the shipped ones
CERTS = os.environ.get("AUTOSCHOLAR_CERTS_DIR") or os.path.join(ROOT, "code", "proofs", "certificates")
os.makedirs(RESULTS, exist_ok=True)
os.makedirs(CERTS, exist_ok=True)


def utcnow():
    return datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds")


def sha256_file(path):
    h = hashlib.sha256()
    with open(path, "rb") as f:
        for chunk in iter(lambda: f.read(1 << 20), b""):
            h.update(chunk)
    return h.hexdigest()


def peak_rss_mb():
    r = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
    # macOS reports bytes, Linux kilobytes
    return r / (1 << 20) if sys.platform == "darwin" else r / 1024.0


def cpu_time():
    r = resource.getrusage(resource.RUSAGE_SELF)
    return r.ru_utime + r.ru_stime


def append_jsonl(path, obj):
    with open(path, "a") as f:
        f.write(json.dumps(obj, sort_keys=True) + "\n")


def log_event(stage, event, **fields):
    rec = {"utc": utcnow(), "stage": stage, "event": event}
    rec.update(fields)
    append_jsonl(os.path.join(RESULTS, "experiment-log.jsonl"), rec)
    return rec


def versions():
    import pysat
    return {"python": sys.version.split()[0], "python_sat": pysat.__version__,
            "platform": sys.platform, "worker": os.environ.get("AUTOSCHOLAR_WORKER", "M4M64c")}
