# -*- coding:utf-8 -*-

import platform
import os,sys
reload(sys)
sys.setdefaultencoding('utf-8')
import shutil
import string
import subprocess

class Environment():
    # 测试结果相关参数
    resultFolder = "result"
    logFolder = "log"
    detailFolder = "detail"
    screenFolder = "screen"
    scriptFolder = "scripts"

    resultDir = ""
    resultDetailDir = ""
    logDir = ""
    screenDir = ""
    scriptDir = ""

    allResultName = "all-result.xml"

    # 测试平台相关配置参数
    windowsCfg = "Environment_windows.cfg"
    linuxCfg = "Environment_linux.cfg"
    configFolder = "config"

    taskFile = ""
    tv_platform = ""
    projectID = ""
    tvIP = ""
    testType = ""
    taskName=""
    changeProjectIDTaskFile = ""
    changeProjectIDTaskName = "task_change_projectid"
    taskRootDir=""
    HOME_DIR=".."
    ANDROID_TV_SCRIPTS_DIR=""
    ANDROID_TV_TEST_DIR=""
    LINUX_TV_SCRIPTS_DIR=""
    LINUX_TV_TEST_DIR = ""
    tvServerSW = "SmokingTest.jar"

    SDK_Relative_Path = "/Lib/site-packages/ssat_sdk/"

def getTvSererSWPath():
    return Environment.HOME_DIR + "/../../" + Environment.tvServerSW

def getTVScriptDir():
    if (Environment.tv_platform == "android"):
        return Environment.ANDROID_TV_SCRIPTS_DIR
    elif (Environment.tv_platform == "linux"):
        return Environment.LINUX_TV_SCRIPTS_DIR

def getTVTestDir():
    if (Environment.tv_platform == "android"):
        return Environment.ANDROID_TV_TEST_DIR
    elif (Environment.tv_platform == "linux"):
        return Environment.LINUX_TV_SCRIPTS_DIR

def getPlatformType():
    return platform.system()

def getFileSeprator():
    sys_str = getPlatformType()
    if (sys_str == "Windows"):
        return "/"
    elif (sys_str == "Linux"):
        return "/"
    else:
        return "/"

def makeResultDir(inDir):
    sys_str = getPlatformType()
    Environment.resultDir = inDir + getFileSeprator() + Environment.resultFolder
    Environment.logDir = Environment.resultDir + getFileSeprator() + Environment.logFolder
    Environment.resultDetailDir = Environment.resultDir + getFileSeprator() + Environment.detailFolder
    Environment.screenDir = Environment.resultDir + getFileSeprator() + Environment.screenFolder
    Environment.scriptDir = Environment.resultDir + getFileSeprator() + Environment.scriptFolder

    if (os.path.isdir(Environment.resultDir)
        and os.path.isdir(Environment.logDir)
        and os.path.isdir(Environment.resultDetailDir)
        and os.path.isdir(Environment.screenDir)
        and os.path.isdir(Environment.scriptDir)):
        return Environment.resultDir

    os.mkdir(Environment.resultDir)
    os.mkdir(Environment.logDir)
    os.mkdir(Environment.screenDir)
    os.mkdir(Environment.scriptDir)
    os.mkdir(Environment.resultDetailDir)
    return Environment.resultDir

def getFileFromAndroidPath(filepath):
    strarr = string.split(filepath, '/')
    filename = strarr[strarr.__len__() - 1]
    return filename
def getFileFromLocalPath(filepath):
    strarr = string.split(filepath, getFileSeprator())
    filename = strarr[strarr.__len__() - 1]
    return filename

def getTaskNameFromFile(taskfile):
    filename = getFileFromLocalPath(taskfile)
    strarr2 = string.split(filename, '.')
    taskname = strarr2[0]
    return taskname

def appendFilePath(dir, filepath):
    filename = getFileFromAndroidPath(filepath)
    sys_str = getPlatformType()
    return dir + getFileSeprator() + filename

def getFileSuffix(filepath):
    filename = getFileFromAndroidPath(filepath)
    strarr2 = string.split(filename, '.')
    suffix = strarr2[strarr2.__len__() - 1]
    print "Current file suffix:", suffix
    return suffix

def getDirFromLocalFilePath(filepath):
    print "getDirFromLocalFilePath,filepath=", filepath
    strarr = string.split(filepath, getFileSeprator())
    fileDir = ""
    for index in range(0, strarr.__len__() - 1):
        if (index == 0):
            fileDir = strarr[0]
        else:
            fileDir = fileDir + getFileSeprator() + strarr[index]
    return fileDir

def copyFile(filepath, destdir):
    sys_str = getPlatformType()
    filepath = Environment.HOME_DIR + getFileSeprator() + Environment.configFolder + getFileSeprator() + filepath
    destFile = destdir + getFileSeprator() + getFileFromLocalPath(filepath)
    print "copyFile,destFile=",destFile
    shutil.copyfile(filepath, destFile)

def setEnvironment(info):
    strarr = info.split("=")
    print "setEnvironment,", strarr
    if (strarr.__len__() == 2):
        if (strarr[0] == "resultDir"):
            Environment.resultDir = strarr[1]
        elif (strarr[0] == "taskFile"):
            Environment.taskFile = strarr[1]
            Environment.taskName = getTaskNameFromFile(Environment.taskFile)
            Environment.taskRootDir = getDirFromLocalFilePath(Environment.taskFile)
            Environment.changeProjectIDTaskFile = Environment.taskRootDir + getFileSeprator() + Environment.changeProjectIDTaskName + ".xml"
        elif (strarr[0] == "tv_platform"):
            Environment.tv_platform = strarr[1]
        elif (strarr[0] == "projectID"):
            Environment.projectID = strarr[1]
        elif (strarr[0] == "tvIP"):
            Environment.tvIP = strarr[1]
        elif (strarr[0] == "testType"):
            Environment.testType = strarr[1]
        elif (strarr[0] == "ANDROID_TV_SCRIPTS_DIR"):
            Environment.ANDROID_TV_SCRIPTS_DIR = strarr[1]
        elif (strarr[0] == "ANDROID_TV_TEST_DIR"):
            Environment.ANDROID_TV_TEST_DIR = strarr[1]
        elif (strarr[0] == "LINUX_TV_SCRIPTS_DIR"):
            Environment.LINUX_TV_SCRIPTS_DIR = strarr[1]
        elif (strarr[0] == "HOME_DIR"):
            Environment.HOME_DIR = strarr[1]

def getConfigFilePath(config):
    return Environment.HOME_DIR + getFileSeprator() + Environment.configFolder + getFileSeprator() + config

def parseConfig(config):
    configpath = getConfigFilePath(config)
    print "parseConfig,configpath=",configpath
    cfgFile = open(configpath,"r",-1)
    strline = "init"
    while (strline <> None and strline <> ""):
        strline = cfgFile.readline().strip("\n").strip("\r")
        print "position=", cfgFile.tell(), ";line:", strline
        info = strline.decode("utf-8", "error")
        #防止文本读取结束时,“#”判断出错
        if (info.__len__() > 1 and info[0] <> "#"):
            #print "position=", cfgFile.tell(), ";line:", strline
            setEnvironment(strline)
    cfgFile.close()

def getScriptsConfig(config):
    print "getScriptsConfig,config=", config
    conDic = {}
    cfgFile = open(config, "r", -1)
    strline = "init"
    while (strline <> None and strline <> ""):
        strline = cfgFile.readline().strip("\n").strip("\r")
        info = strline.decode("utf-8", "error")
        # 防止文本读取结束时,“#”判断出错
        if (info.__len__() > 1 and info[0] <> "#"):
            print "position=", cfgFile.tell(), ";line:", info.encode("utf-8")
            strarr = info.split("=")
            print "getConfig,", strarr
            if (strarr.__len__() > 1):
                conDic[strarr[0]] = strarr[1]
    cfgFile.close()
    return conDic


def loadConfig():
    sys_str = getPlatformType()
    if (sys_str == "Windows"):
        parseConfig(Environment.windowsCfg)
    elif (sys_str == "Linux"):
        parseConfig(Environment.linuxCfg)
    else:
        parseConfig(Environment.linuxCfg)

#在一行长文本中,用空格分开字符串,寻找第findNumber个 数字字符串,
def findNumber(findNumber, strinfo):
    print strinfo
    strarr = string.split(strinfo, " ")
    print strarr
    findCount = 0
    for index in range(0, strarr.__len__()):
        if (strarr[index].__len__() > 0):
            flag = False
            for char in strarr[index]:
                if (char >= '0' and char <= '9'):
                    flag = True
                    continue
                else:
                    flag = False
                    break
            if (flag == True):
                findCount = findCount + 1
                print "findNumber=",findNumber, ";;findCount=", findCount, ",str=", strarr[index]
                if (findCount == findNumber):
                    return strarr[index]
    return ""

def checkTVTestProcessAndClose():
    sys_str = getPlatformType()
    if (Environment.tv_platform == "android" and sys_str == "Windows"):
        cmd = "adb -s " + Environment.tvIP + ":5555 shell ps| find \"uiautomator\""
        print cmd
        cprocess = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        resstr = cprocess.stdout.read()
        uaPid = findNumber(1, resstr)
        cmd = "adb -s " + Environment.tvIP + ":5555 shell kill " + uaPid
        print cmd
        krocess = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        resstr = krocess.stdout.read()

'''
根据传入的进程id,检测进程是否存在
'''
def checkProcess(pid):
    cmd = "tasklist | findstr " + str(pid)
    cprocess = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    psInfo = cprocess.stdout.readline()
    if psInfo.__len__() > 0:
        return True
    else:
        return False