#!/usr/bin/env python3
"""
Extract BITS jobs from QMGR queue or disk image to CSV file.

Usage:
  bits_parser [options] [-o OUTPUT] FILE

Options:
  --no-carving                        Disable carving.

  --disk-image, -i                    Data input is a disk image.
  --radiance=VALUE                    Radiance in kB. [default: 2048]
  --skip-sampling                     Skip sampling and load file in memory.
  --checkpoint=PATH                   Store disk checkpoint file.

  --out=OUTPUT, -o OUTPUT             Write result to OUTPUT [default: stdout]
  --verbose, -v                       More verbosity.
  --debug                             Display debug messages.

  --help, -h                          Show this screen.
  --version                           Show version.
"""

from docopt import docopt
from pathlib import Path

import bits
import logging
import logging.config

from bits.const import XFER_HEADER

# default logger configuration
logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'default': {
            'format': ('%(asctime)s.%(msecs)03d '
                       '[%(levelname)s] %(name)s: %(message)s'),
            'datefmt': '%Y-%m-%dT%H:%M:%S'
        },
    },
    'handlers': {
        'default': {
            'class': 'logging.StreamHandler',
            'formatter': 'default',
        },
    },
    'loggers': {
        '': {
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate': True,
        },
    },
})


if __name__ == '__main__':

    args = docopt(__doc__, version=bits.__version__)

    if args['--verbose']:
        logging.getLogger().setLevel(logging.INFO)

    if args['--debug']:
        logging.getLogger().setLevel(logging.DEBUG)

    file_in = Path(args['FILE'])
    file_out = Path(
        '/dev/stdout' if args['--out'] == 'stdout' else args['--out']
    )

    if args['--disk-image'] and not args['--skip-sampling']:
        # load interesting fragments as raw data
        analyzer = bits.Bits()
        radiance = int(args['--radiance'])

        checkpoint = None
        checkpoint_fp = args['--checkpoint']
        if checkpoint_fp is not None:
            checkpoint_fp = Path(checkpoint_fp)
            checkpoint = checkpoint_fp.open('wb')

        for sample in bits.sample_disk(file_in, XFER_HEADER, radiance):
            analyzer.append_data(sample)
            if checkpoint:
                checkpoint.write(sample)

        if checkpoint:
            checkpoint.close()

        analyzer.guess_info()
    elif args['--disk-image']:
        analyzer = bits.Bits()
        with file_in.open('rb') as f:
            analyzer.append_data(f.read())
        analyzer.guess_info()

    else:
        analyzer = bits.Bits.load_file(file_in)

    jobs = analyzer.parse() if args['--no-carving'] else analyzer
    bits.write_csv(file_out, jobs)

    exit()
