#
# Copyright (C) 2019 Intel Corporation.  All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#

#!/usr/bin/env python

# -*- coding: utf-8 -*-
"""
It is the entrance of the iagent test framework.

"""
from __future__ import print_function

import argparse
import datetime
import os
import pprint
import random
import re
import shlex
import subprocess
import signal
import sys
import time

sys.path.append('../../../app-sdk/python')
from framework.test_utils  import *
from framework.framework  import *


def signal_handler(signal, frame):
        print('Pressed Ctrl+C!')
        sys.exit(0)

def Register_signal_handler():
    signal.signal(signal.SIGINT, signal_handler)
#    signal.pause()


def flatten_args_list(l):
    if l is None:
        return None

    return [x for y in l for x in y]



if __name__ == "__main__":
    parser = argparse.ArgumentParser(description = "to run specific case(s) "\
            "in specific suite(s) with FC test framework")
    parser.add_argument('-s', dest = 'suite_id', action = 'append',
            nargs = '+',
            help = 'one or multiple suite ids, which are also setup ids.'\
                    'by default if it isn\'t passed from argument, all '\
                    'suites are going to be run.')
    parser.add_argument('-t', dest = 'case_id', action = 'append',
            nargs = '+',
            help = 'one or multiple cases ids.'\
                    'by default if it isn\'t passed from argument, all '\
                    'cases in specific suites are going to be run.')
    parser.add_argument('-n', dest = 'repeat_time', action = 'store',
            default = 1,
            help = 'how many times do you want to run. there is 40s '\
                    'break time between two rounds. each round includs '\
                    'init_setup, run_test_case and deinit_setup.')
    parser.add_argument('--shuffle_all', dest = 'shuffle_all',
            default = False, action = 'store_true',
            help = 'shuffle_all test cases in per test suite '\
                    'by default, all cases under per suite should '\
                    'be executed by input order.')
    parser.add_argument('--cases_list', dest='cases_list_file_path',
            default=None,
            action='store',
            help="read cases list from a flie ")
    parser.add_argument('--skip_proc', dest='skip_proc',
            default = False, action = 'store_true',
            help='do not start the test process.'\
                'sometimes the gw_broker process will be started in eclipse for debug purpose')
    parser.add_argument('-b', dest = 'binaries', action = 'store',
            help = 'The path of target folder ')
    parser.add_argument('-d', dest = 'debug', action = 'store_true',
            help = 'wait user to  attach the target process after launch processes ')
    parser.add_argument('--rebuild', dest = 'rebuild', action = 'store_true',
            help = 'rebuild all test binaries')
    args = parser.parse_args()

    print("------------------------------------------------------------")
    print("parsing arguments ... ...")
    print(args)

    '''
    logger = logging.getLogger('coapthon.server.coap')
    logger.setLevel(logging.DEBUG)
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    logger.addHandler(console)
    '''
    print("------------------------------------------------------------")
    print("preparing wamr binary and test tools ... ...")
    os.system("cd ../../samples/simple/ && bash build.sh -p host-interp")

    Register_signal_handler()

    api_init_globals();

    api_create_case_event();

    suites_list = flatten_args_list(args.suite_id)
    cases_list = flatten_args_list(args.case_id)

    dirname, filename = os.path.split(os.path.abspath(sys.argv[0]))
    api_set_root_path(dirname);

    framework = CTestFramework(dirname);
    framework.repeat_time = int(args.repeat_time)
    framework.shuffle_all = args.shuffle_all
    framework.skip_proc=args.skip_proc

    api_set_value('keep_env', args.skip_proc)
    api_set_value('debug', args.debug)
    api_set_value('rebuild', args.rebuild)

    binary_path = args.binaries
    if  binary_path is None:
        binary_path = os.path.abspath(dirname + '/../..')

    print("checking execution binary path: " + binary_path)
    if not os.path.exists(binary_path):
        print("The execution binary path was not available. quit...")
        os._exit(0)
    api_set_value('binary_path', binary_path)

    if suites_list is not None:
        framework.target_suites = suites_list
    else:
        framework.load_suites()

    framework.target_cases = cases_list
    framework.start_run()

    print("\n\n------------------------------------------------------------")
    print("The run folder is [" + framework.running_folder +"]")
    print("that's all. bye")

    print("kill to quit..")
    t_kill_process_by_name("start.py")

    sys.exit(0)
    os._exit()