Used by core to integrate all the pieces of information, and to interface
    with the user. Compiles and cleans up.

def cytherize(args, file):
    """
    Used by core to integrate all the pieces of information, and to interface
    with the user. Compiles and cleans up.
    """
    if isOutDated(file):
        if isUpdated(file):
            response = initiateCompilation(args, file)
        else:
            response = {'returncode': WAIT_FOR_FIX, 'output': ''}
    else:
        if args['timestamp']:
            response = {'returncode': SKIPPED_COMPILATION, 'output': ''}
        else:
            response = initiateCompilation(args, file)

    ###########################################################################

    time.sleep(INTERVAL)
    if response['returncode'] == ERROR_PASSOFF:
        file['stamp_if_error'] = time.time()
        if args['watch']:
            if len(args['filenames']) > 1:
                output = "Error in file: '{}'; Cyther will wait until it is" \
                         "fixed...\n".format(file['file_path'])
            else:
                output = "Cyther will wait for you to fix this error before" \
                         "it tries to compile again...\n"
        else:
            output = "Error in source file, see above\n"

    elif response['returncode'] == SKIPPED_COMPILATION:
        if not args['watch']:
            output = 'Skipping compilation: source file not updated since' \
                     'last compile\n'
        else:
            output = ''

    elif response['returncode'] == WAIT_FOR_FIX:
        output = ''

    elif response['returncode'] == FINE:
        if args['watch']:
            if len(args['filenames']) > 1:
                output = "Compiled the file '{}'\n".format(file['file_path'])
            else:
                output = 'Compiled the file\n'
        else:
            if not args['concise']:
                output = 'Compilation complete\n'
            else:
                output = ''

    else:
        raise CytherError("Unrecognized return value '{}'"
                          "".format(response['returncode']))

    response['output'] += output

    ###########################################################################

    condition = response['returncode'] == SKIPPED_COMPILATION and not args[
        'watch']
    if (args['execute'] or args['timer']) and response[
        'returncode'] == FINE or condition:
        ret = cueExtractAndRun(args, file)
        response['output'] += ret['output']

    ###########################################################################

    if args['watch']:
        if response['returncode'] == FINE or response[
            'returncode'] == ERROR_PASSOFF:
            if response['returncode'] == FINE:
                args['watch_stats']['compiles'] += 1
            else:
                args['watch_stats']['errors'] += 1
            args['watch_stats']['counter'] += 1
            response['output'] += \
                WATCH_STATS_TEMPLATE.format(args['watch_stats']['counter'],
                                            args['watch_stats']['compiles'],
                                            args['watch_stats']['errors'],
                                            args['watch_stats']['polls'])
        else:
            args['watch_stats']['polls'] += 1

    ###########################################################################

    if args['watch']:
        if response['returncode'] == 1:
            print(response['output'] + '\n')
        else:
            if response['output']:
                print(response['output'])
    else:
        if response['returncode'] == 1:
            if args['error']:
                raise CytherError(response['output'])
            else:
                print(response['output'])
        else:
            print(response['output'])