#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import re
import sys
import time

from robot.run import run_cli

def show_all_modules():
    dirs = dt4test.__dir__()
    for m in dirs:
        if not (m.startswith('_') or m == 'lib' or m == 'resource'):
            at = dt4test.__getattribute__(m)
            if at.__module__.find(".resource.") != -1:
                print("Resource {}:{}".format(m, at.__doc__.splitlines()[1].strip() if at.__doc__ else ""))
            else:
                print("Lib {}:{}".format(m, at.__doc__.splitlines()[1].strip() if at.__doc__ else ""))

    user_res = dt4test.resource.get_user_resource()
    if len(user_res) == 0:
        return 0
    for res in user_res.keys():
        print("User Res: "+res)
    return 0


def show_usage():
    print("***********dt4test client***************")
    print("Log file:{}".format(dt4test.Logger().get_logfile()))
    print(">> 所有模块 ... ")
    show_all_modules()
    print(">> dt 模块名 [模块参数] ：得到具体的帮助和执行相应的操作")
    print("*****************************************")


if __name__ == '__main__':

    if len(sys.argv) == 2 and sys.argv[1] == 'init':
        print(">> 请输入目录名称， 如： dt init test_project")
        exit(1)

    if len(sys.argv) == 3 and sys.argv[1] == 'init':
        dir_name = sys.argv[2]
        if os.path.exists(dir_name):
            os.environ["PROJECT_DIR"] = os.path.abspath(dir_name)
        else:
            print(">> 找不到目录, 新建目录 {} ...".format(dir_name))
            os.mkdir(dir_name)
            os.environ["PROJECT_DIR"] = os.path.abspath(dir_name)
        print(">> 项目目录初始化完成，请手动执行：export PROJECT_DIR={}".format(os.path.abspath(dir_name)))
        exit(0)


    # 【check】环境变量的check， 在dt脚本开始
    if not os.environ.get("PROJECT_DIR", None):
        print("ERROR : 没有发现环境变量 'PROJECT_DIR' ，请运行 dt init ${PRJECT_DIR} 初始化")
        print("        如果${PRJECT_DIR}不存在则会创建，如果相应的配置文件不存在，则会自动增加")
        exit(1)

    import dt4test

    PROJECT_DIR = os.environ.get("PROJECT_DIR")

    myos = dt4test.o_s
    myenv = dt4test.env
    poster = dt4test.poster
    proc = dt4test.proc
    monitor = dt4test.monitor
    resource = dt4test.resource

    if len(sys.argv) == 1:
        show_usage()
        exit(1)

    if len(sys.argv) >= 2 and sys.argv[1] == 'webui':
        port = "8081"
        if len(sys.argv) == 3:
            port = str(sys.argv[2])
        dirs = os.path.dirname(dt4test.__file__) + '/webui'
        os.chdir(dirs)
        print('>> Start web ui {} : nohup python app.py --host 0.0.0.0 --port {} & '.format(dirs, port))
        os.system('nohup python app.py --host 0.0.0.0 --port ' + port + ' & ')
        myos.create_file(PROJECT_DIR + "/output/.webui.info", "127.0.0.1 " + port)
        exit(0)

    if len(sys.argv) >= 2 and sys.argv[1] == 'agent':
        pid_file = '/tmp/dtagent.pid'
        if len(sys.argv) != 5:
            print("Should Be: " + sys.argv[0] + " agent cia_ip cia_port my_role")
            exit(1)

        if os.path.exists(pid_file):
            with open(pid_file, 'r') as pf:
                pid = pf.readline().strip()
            result = proc.run_process("ps -ef| grep " + pid + " | awk '{ print " + "$2" + "'}|grep " + pid, shell=True)
            if result.stdout != "":
                print("Agent start alread, Pid: {}".format(pid))
                exit(1)

        dirs = os.path.dirname(dt4test.__file__) + '/webui'
        utils = dirs + "/utils"
        os.chdir(utils)
        print('>> Start Agent: nohup python dtagent.py {} {} {} & '.format(sys.argv[2], sys.argv[3], sys.argv[4]))
        os.system('nohup python dtagent.py {} {} {} &'.format(sys.argv[2], sys.argv[3], sys.argv[4]))

        time.sleep(3)
        with open(pid_file, 'r') as pf:
            info = pf.readline()
            print("Agent started, Pid: {} \n".format(info))
        exit(0)

    if len(sys.argv) >= 2 and sys.argv[1] in ['env', 'ssh', 'sshf', 'scp','put','get']:
        exit(myenv.cli(sys.argv))

    if len(sys.argv) >= 2 and sys.argv[1] == 'poster':
        exit(poster.cli(sys.argv))

    if len(sys.argv) >= 2 and sys.argv[1] == 'monitor':
        exit(monitor.cli(sys.argv))

    if len(sys.argv) >= 4 and sys.argv[1] == 'create' and sys.argv[2] == 'monitor':
        exit(monitor.cli(sys.argv))

    if len(sys.argv) >= 2 and sys.argv[1] == 'resource':
        exit(resource.cli(sys.argv))

    if len(sys.argv) >= 4 and sys.argv[1] == 'create' and sys.argv[2] == 'resource':
        exit(resource.cli(sys.argv))

    if len(sys.argv) >= 2 and sys.argv[1].endswith('.robot'):
        os.environ["ROBOT_OPTIONS"] = "--outputdir "+ PROJECT_DIR + "/output/" + dt4test.base.gen_outputdir()
        sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
        sys.exit(run_cli())

    if len(sys.argv) >= 2:
        user_res = resource.get_user_resource()
        exit(user_res[sys.argv[1]].cli(sys.argv))

