import argparse
import json
import os
import sys

# TODO: Rather nasty hack, when volatility's actually installed this would be unnecessary
sys.path += ".."

import logging

console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(levelname)-8s %(name)-12s: %(message)s')
console.setFormatter(formatter)

logger = logging.getLogger("")
logger.addHandler(console)
logger.setLevel(logging.DEBUG)

from volatility3 import schemas

if __name__ == '__main__':
    parser = argparse.ArgumentParser("Validates ")
    parser.add_argument("-s", "--schema", dest = "schema", default = None)
    parser.add_argument("filenames", metavar = "FILE", nargs = '+')

    args = parser.parse_args()

    schema = None
    if args.schema:
        with open(os.path.abspath(args.schema), 'r') as s:
            schema = json.load(s)

    failures = []
    for filename in args.filenames:
        try:
            if os.path.exists(filename):
                print(f"[?] Validating file: {filename}")
                with open(filename, 'r') as t:
                    test = json.load(t)

                if args.schema:
                    result = schemas.valid(test, schema, False)
                else:
                    result = schemas.validate(test, False)

                if result:
                    print(f"[+] Validation successful: {filename}")
                else:
                    print(f"[-] Validation failed: {filename}")
                    failures.append(filename)
            else:
                print(f"[x] File not found: {filename}")
        except Exception as e:
            failures.append(filename)
            print(f"[x] Exception occurred: {filename} ({repr(e)})")

    print("Failures", failures)
