import sys, cmakelib, json, os, shutil

debug = True

cmakeCommand = sys.argv[1]
testFile = sys.argv[2]
sourceDir = sys.argv[3]
buildDir = sys.argv[4] + "/" + os.path.splitext(os.path.basename(testFile))[0]
cmakeGenerator = sys.argv[5]

print("Test:", testFile,
      "\n-- SourceDir:", sourceDir,
      "\n-- BuildDir:", buildDir,
      "\n-- Generator:", cmakeGenerator)

if os.path.exists(buildDir):
    shutil.rmtree(buildDir)

proc = cmakelib.initProc(cmakeCommand)

with open(testFile) as f:
    testData = json.loads(f.read())

for obj in testData:
    if 'sendRaw' in obj:
        data = obj['sendRaw']
        if debug: print("Sending raw:", data)
        cmakelib.writeRawData(proc, data)
    elif 'send' in obj:
        data = obj['send']
        if debug: print("Sending:", json.dumps(data))
        cmakelib.writePayload(proc, data)
    elif 'recv' in obj:
        data = obj['recv']
        if debug: print("Waiting for:", json.dumps(data))
        cmakelib.waitForMessage(proc, data)
    elif 'reply' in obj:
        data = obj['reply']
        if debug: print("Waiting for reply:", json.dumps(data))
        originalType = ""
        cookie = ""
        skipProgress = False;
        if 'cookie' in data: cookie = data['cookie']
        if 'type' in data: originalType = data['type']
        if 'skipProgress' in data: skipProgress = data['skipProgress']
        cmakelib.waitForReply(proc, originalType, cookie, skipProgress)
    elif 'error' in obj:
        data = obj['error']
        if debug: print("Waiting for error:", json.dumps(data))
        originalType = ""
        cookie = ""
        message = ""
        if 'cookie' in data: cookie = data['cookie']
        if 'type' in data: originalType = data['type']
        if 'message' in data: message = data['message']
        cmakelib.waitForError(proc, originalType, cookie, message)
    elif 'progress' in obj:
        data = obj['progress']
        if debug: print("Waiting for progress:", json.dumps(data))
        originalType = ''
        cookie = ""
        current = 0
        message = ""
        if 'cookie' in data: cookie = data['cookie']
        if 'type' in data: originalType = data['type']
        if 'current' in data: current = data['current']
        if 'message' in data: message = data['message']
        cmakelib.waitForProgress(proc, originalType, cookie, current, message)
    elif 'handshake' in obj:
        data = obj['handshake']
        if debug: print("Doing handshake:", json.dumps(data))
        major = -1
        minor = -1
        generator = cmakeGenerator
        extraGenerator = ''
        sourceDirectory = sourceDir
        buildDirectory = buildDir
        if 'major' in data: major = data['major']
        if 'minor' in data: minor = data['minor']
        if 'buildDirectory' in data: buildDirectory = data['buildDirectory']
        if 'sourceDirectory' in data: sourceDirectory = data['sourceDirectory']
        if 'generator' in data: generator = data['generator']
        if 'extraGenerator' in data: extraGenerator = data['extraGenerator']
        if not os.path.isabs(buildDirectory):
            buildDirectory = buildDir + "/" + buildDirectory
        if not os.path.isabs(sourceDirectory):
            sourceDirectory = sourceDir + "/" + sourceDirectory
        cmakelib.handshake(proc, major, minor, sourceDirectory, buildDirectory,
          generator, extraGenerator)
    elif 'validateGlobalSettings' in obj:
        data = obj['validateGlobalSettings']
        if not 'buildDirectory' in data: data['buildDirectory'] = buildDir
        if not 'sourceDirectory' in data: data['sourceDirectory'] = sourceDir
        if not 'generator' in data: data['generator'] = cmakeGenerator
        if not 'extraGenerator' in data: data['extraGenerator'] = ''
        cmakelib.validateGlobalSettings(proc, cmakeCommand, data)
    elif 'message' in obj:
        print("MESSAGE:", obj["message"])
    else:
        print("Unknown command:", json.dumps(obj))
        sys.exit(2)

    print("Completed")

# Tell the server to exit.
proc.stdin.close()
proc.stdout.close()

# Wait for the server to exit.
# If this version of python supports it, terminate the server after a timeout.
try:
    proc.wait(timeout=5)
except TypeError:
    proc.wait()
except:
    proc.terminate()
    raise

sys.exit(0)
