"""Record the loaded Python and edlib binaries without reading biological data."""
import argparse
import hashlib
import importlib.metadata
import json
import os
from pathlib import Path
import platform
import sys


def digest(path):
    result = hashlib.sha256()
    with Path(path).open('rb') as stream:
        for block in iter(lambda: stream.read(1024 * 1024), b''):
            result.update(block)
    return result.hexdigest()


def identity():
    import edlib
    interpreter = Path(sys.executable).resolve(strict=True)
    binary = Path(edlib.__file__).resolve(strict=True)
    return dict(python_version=platform.python_version(),
                python_implementation=platform.python_implementation(),
                python_executable=str(interpreter), python_sha256=digest(interpreter),
                edlib_version=importlib.metadata.version('edlib'),
                edlib_binary=str(binary), edlib_sha256=digest(binary))


def require(expected):
    observed = identity()
    if observed != expected:
        raise ValueError('Python/edlib runtime differs from registered identity')
    return observed


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('output', type=Path)
    args = parser.parse_args()
    if not os.environ.get('SLURM_JOB_ID'):
        raise RuntimeError('Production runtime inventory requires a Slurm allocation')
    result = dict(runtime=identity(), job_id=os.environ['SLURM_JOB_ID'],
                  probe_sha256=digest(__file__), biological_payload_read=False)
    with args.output.open('x') as target:
        target.write(json.dumps(result, indent=2) + '\n')
