#!/usr/bin/env python3

import argparse
import json
import sys

r"""
Validates the PEL message registry JSON, which includes checking it against
a JSON schema using the jsonschema module as well as doing some extra checks
that can't be encoded in the schema.
"""


def check_duplicate_names(registry_json):
    r"""
    Check that there aren't any message registry entries with the same
    'Name' field.  There may be a use case for this in the future, but there
    isn't right now.

    registry_json: The message registry JSON
    """

    names = []
    for entry in registry_json['PELs']:
        if entry['Name'] in names:
            sys.exit("Found multiple uses of error {}".format(entry['Name']))
        else:
            names.append(entry['Name'])


def check_duplicate_reason_codes(registry_json):
    r"""
    Check that there aren't any message registry entries with the same
    'ReasonCode' field.

    registry_json: The message registry JSON
    """

    reasonCodes = []
    for entry in registry_json['PELs']:
        if entry['SRC']['ReasonCode'] in reasonCodes:
            sys.exit("Found duplicate SRC reason code {}".format(
                entry['SRC']['ReasonCode']))
        else:
            reasonCodes.append(entry['SRC']['ReasonCode'])


def check_component_id(registry_json):
    r"""
    Check that the upper byte of the ComponentID field matches the upper byte
    of the ReasonCode field, but not on "11" type SRCs where they aren't
    supposed to match.

    registry_json: The message registry JSON
    """

    for entry in registry_json['PELs']:

        # Don't check on "11" SRCs as those reason codes aren't supposed to
        # match the component ID.
        if entry['SRC'].get('Type', '') == "11":
            continue

        if 'ComponentID' in entry:
            id = int(entry['ComponentID'], 16)
            reason_code = int(entry['SRC']['ReasonCode'], 16)

            if (id & 0xFF00) != (reason_code & 0xFF00):
                sys.exit("Found mismatching component ID {} vs reason "
                         "code {} for error {}".format(
                             entry['ComponentID'],
                             entry['SRC']['ReasonCode'],
                             entry['Name']))


def check_message_args(registry_json):
    r"""
    Check that if the Message field uses the '%' style placeholders that there
    are that many entries in the MessageArgSources field.  Also checks that
    the MessageArgSources field is present but only if there are placeholders.

    registry_json: The message registry JSON
    """

    for entry in registry_json['PELs']:
        num_placeholders = entry['Documentation']['Message'].count('%')
        if num_placeholders == 0:
            continue

        if 'MessageArgSources' not in entry['Documentation']:
            sys.exit("Missing MessageArgSources property for error {}".
                     format(entry['Name']))

        if num_placeholders != \
                len(entry['Documentation']['MessageArgSources']):
            sys.exit("Different number of placeholders found in "
                     "Message vs MessageArgSources for error {}".
                     format(entry['Name']))


def validate_schema(registry, schema):
    r"""
    Validates the passed in JSON against the passed in schema JSON

    registry: Path of the file containing the registry JSON
    schema:   Path of the file containing the schema JSON
              Use None to skip the pure schema validation
    """

    with open(registry) as registry_handle:
        registry_json = json.load(registry_handle)

        if schema:

            import jsonschema

            with open(schema) as schema_handle:
                schema_json = json.load(schema_handle)

                try:
                    jsonschema.validate(registry_json, schema_json)
                except jsonschema.ValidationError as e:
                    print(e)
                    sys.exit("Schema validation failed")

        check_duplicate_names(registry_json)

        check_duplicate_reason_codes(registry_json)

        check_component_id(registry_json)

        check_message_args(registry_json)


if __name__ == '__main__':

    parser = argparse.ArgumentParser(
        description='PEL message registry processor')

    parser.add_argument('-v', '--validate', action='store_true',
                        dest='validate',
                        help='Validate the JSON using the schema')

    parser.add_argument('-s', '--schema-file', dest='schema_file',
                        help='The message registry JSON schema file')

    parser.add_argument('-r', '--registry-file', dest='registry_file',
                        help='The message registry JSON file')
    parser.add_argument('-k', '--skip-schema-validation', action='store_true',
                        dest='skip_schema',
                        help='Skip running schema validation. '
                             'Only do the extra checks.')

    args = parser.parse_args()

    if args.validate:
        if not args.schema_file:
            sys.exit("Schema file required")

        if not args.registry_file:
            sys.exit("Registry file required")

        schema = args.schema_file
        if args.skip_schema:
            schema = None

        validate_schema(args.registry_file, schema)
