#!/usr/bin/env python

from argparse import ArgumentParser
from logging import basicConfig, INFO, getLogger
from os import name
from pathlib import Path
from subprocess import Popen
from sys import executable

from colorama import init, Fore
from pyjson5 import decode_io


argparser = ArgumentParser(description='Run JSON5 parser tests')
argparser.add_argument('tests', nargs='?', type=Path, default=Path('third-party/JSONTestSuite/test_parsing'))

suffix_implies_success = {
    'json': True,
    'json5': True,
    'txt': False,
}

if __name__ == '__main__':
    basicConfig(level=INFO)
    logger = getLogger(__name__)

    init()

    good = bad = severe = 0

    if name != 'nt':
        code_severe = Fore.RED + '😱'
        code_good = Fore.CYAN + '😄'
        code_bad = Fore.YELLOW + '😠'
        code_ignored = Fore.BLUE + '🙅'
    else:
        code_severe = Fore.RED + 'SEVERE'
        code_good = Fore.CYAN + 'GOOD'
        code_bad = Fore.YELLOW + 'BAD'
        code_ignored = Fore.BLUE + 'IGNORED'

    args = argparser.parse_args()
    index = 0
    for path in sorted(args.tests.glob('?_?*.json')):
        category, name = path.stem.split('_', 1)
        if category not in 'yni':
            continue

        if category in 'ni':
            # ignore anything but tests that are expected to pass for now
            continue

        try:
            # ignore any UTF-8 errors
            with open(str(path.resolve()), 'rt') as f:
                f.read()
        except Exception:
            continue

        index += 1
        try:
            p = Popen((executable, 'transcode-to-json.py', str(path)))
            outcome = p.wait(5)
        except Exception:
            logger.error('Error while testing: %s', path, exc_info=True)
            errors += 1
            continue

        if outcome not in (0, 1):
            code = code_severe
            severe += 1
        elif category == 'y':
            if outcome == 0:
                code = code_good
                good += 1
            else:
                code = code_bad
                bad += 1
        else:
            code = code_ignored

        print(
            '#', index, ' ', code, ' | '
            'Category <', category, '> | '
            'Test <', name, '> | '
            'Actual <', 'pass' if outcome == 0 else 'FAIL', '>',
            Fore.RESET,
            sep='',
        )

    is_severe = severe > 0
    is_good = bad == 0
    code = code_severe if is_severe else code_good if is_good else code_bad
    print()
    print(
        code, ' | ',
        good, ' correct outcomes | ',
        bad, ' wrong outcomes | ',
        severe, ' severe errors',
        Fore.RESET,
        sep=''
    )
    raise SystemExit(2 if is_severe else 0 if is_good else 1)
