#!/usr/bin/env python3

# Small tool to dump JSON payload for coveralls.io API

import json
from operator import itemgetter
import os
import sys


def warn(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)


def dump_file(json_file):
    """Dumps coveralls.io API payload stored in json_file
       Returns: 0 if successful, 1 otherwise
    """
    try:
        with open(json_file, encoding='utf8') as f:
            data = json.load(f)
    except OSError as err:
        warn(err)
        return os.EX_DATAERR
    except json.decoder.JSONDecodeError:
        warn("{}: json parsing error".format(json_file))
        return 1

    if 'source_files' not in data:
        warn("{}: no source_files, not a coveralls.io payload?".format(json_file))
        return 1

    print("{} ({} source files)".format(json_file, len(data['source_files'])))

    for src_file in sorted(data['source_files'], key=itemgetter('name')):
        covered_lines = not_skipped_lines = 0
        for cnt in src_file['coverage']:
            if cnt is None:
                continue
            not_skipped_lines += 1
            if cnt > 0:
                covered_lines += 1
        if not_skipped_lines > 0:
            coverage = "{:.0%}".format(covered_lines / not_skipped_lines)
        else:
            coverage = 'N/A'

        print("\t{:>3} {}".format(coverage, src_file['name']))

    return 0


def main():
    if (len(sys.argv) < 2):
        warn("usage: {} file.json ...".format(sys.argv[0]))
        return os.EX_USAGE

    exit_status = 0
    for f in sys.argv[1:]:
        exit_status += dump_file(f)

    return exit_status


if __name__ == '__main__':
    sys.exit(main())
