#!/usr/bin/env python

import json, sys, time

def is_inside(range1, range2):
    a = range1["ts"]; b = a + range1["dur"]
    c = range2["ts"]; d = c + range2["dur"]
    return (a >= c and a <= d) and (b >= c and b <= d)

def is_before(range1, range2):
    b = range1["ts"] + range1["dur"]; c = range2["ts"]
    return b <= c

log_contents = json.loads(sys.stdin.read())
events = log_contents["traceEvents"]
codegens = [event for event in events if event["name"] == "CodeGen Function"]
frontends = [event for event in events if event["name"] == "Frontend"]
backends = [event for event in events if event["name"] == "Backend"]

beginning_of_time = log_contents["beginningOfTime"] / 1000000
seconds_since_epoch = time.time()

# Make sure that the 'beginningOfTime' is not later than now.
if beginning_of_time > seconds_since_epoch:
    sys.exit("'beginningOfTime' should represent the absolute time when the "
             "process has started")

if not all([any([is_inside(codegen, frontend) for frontend in frontends])
                        for codegen in codegens]):
    sys.exit("Not all CodeGen sections are inside any Frontend section!")

if not all([all([is_before(frontend, backend) for frontend in frontends])
                        for backend in backends]):
    sys.exit("Not all Frontend section are before all Backend sections!")
