#!/usr/bin/env python3
#
# Checker for 'idleex' task limits
#

import pscheduler

from validate import spec_is_valid
from validate import limit_is_valid

#
# Load and validate everything
#

try:
    json = pscheduler.json_load(max_schema=1)
except ValueError as ex:
    pscheduler.fail("Invalid JSON %s" % str(ex))

spec = json['spec']
valid, message = spec_is_valid(spec)
if not valid:
    raise ValueError("Invalid test spec: %s" % message)

limit = json['limit']
valid, message = limit_is_valid(limit)
if not valid:
    raise ValueError("Invalid limit: %s" % message)


#
# Evaluate everything
#

errors = []

# Duration Range

try:
    drange = pscheduler.DurationRange(limit["duration"]["range"])
    try:
        invert = limit["duration"]["invert"]
    except KeyError:
        invert = False

    contains, message = drange.contains(spec["duration"], invert)
    if not contains:
        errors.append("Duration is %s" % message)

except KeyError:
    pass  # Not there?  Don't care.


# Starting and parting comments

for key, what in [
        ("starting-comment", "Starting comment" ),
        ("parting-comment", "Parting comment" ),
        ]:
    try:
        match = pscheduler.StringMatcher(limit[key]['match'])
        if not match.matches(spec[key]):
            try:
                errors.append(limit[key]["fail-message"])
            except KeyError:
                errors.append("%s does not match limit" % what)
    except KeyError:
        pass  # Don't care if not there.


result = { "passes": not errors }

if errors:
    result["errors"] = errors

pscheduler.succeed_json(result)
