FILE    The notebook file to run.
"""

from docopt import docopt
import os
from pathlib import Path
import json

import nbformat
from nbconvert.exporters import HTMLExporter

import papermill as pm

from bookgender.logutils import start_script

_log = start_script(__file__)

args = docopt(__doc__)
nbfile = Path(args['FILE'])
tmp_nbf = nbfile.with_suffix('.temp.ipynb')

try:
    pfile = args['--param-json']
    if pfile:
        with open(pfile, 'r') as pf:
            params = json.load(pf)
    else:
        params = {}

    _log.info('executing notebook')
    pm.execute_notebook(os.fspath(nbfile), os.fspath(tmp_nbf), params)
    _log.info('inspecting file %s', opts.path)
    stat = opts.path.stat()
    _log.info('file size: %s (%s)', stat.st_size, binarysize(stat.st_size))

    timer = Stopwatch()
    with opts.path.open('rb') as f:
        model = pickle.load(f)
    timer.stop()
    gc.collect()
    res = resource.getrusage(resource.RUSAGE_SELF)
    _log.info('loaded model in %s', timer)
    _log.info('max RSS %s', binarysize(res.ru_maxrss * 1024))

    bufs = PBJar()
    timer = Stopwatch()
    p_bytes = pickle5.dumps(model, protocol=5, buffer_callback=bufs)
    timer.stop()
    bsize = bufs.total_size()
    _log.info('pickled to %d bytes in %s', len(p_bytes), timer)
    _log.info('with %d bytes of buffers', bsize)
    _log.info('total size: %s', binarysize(len(p_bytes) + bsize))
    _log.info('compresses to: %s', binarysize(len(p_bytes) + bufs.encoded_size()))


if __name__ == '__main__':
    opts = InspectOpts(__doc__)
    _log = start_script(__file__, opts.verbose)
    inspect(opts)
else:
    _log = logging.getLogger(__name__)