# -*- coding: utf-8 -*-
import sys,os,time
reload(sys)
sys.setdefaultencoding('utf-8')
from utils.test_task import *
from utils.platform_Util import *
from sat_environment import *
from utils import *
from core.process_sync import *
import shutil,json
from runner import runner_sender

class ResultTool(ProcessSync):
    Result_DIR = getResultDir()
    Result_DETAIL = "detail"
    Result_Total_XSL = r"config/all-result.xsl"
    Result_Detail_XSL = r"config/case_result_detail.xsl"
    Python_Home = sys.prefix

    Action_DetailResult = "detail_result"
    Action_CaseResult = "case_result"

    Key_CaseName = "case_name"
    Key_CaseResult = "case_result"
    Key_ItemName = "item_name"
    Key_ItemResult = "item_result"
    Key_ItemScreen = "item_screen"
    Key_ItemLog = "item_log"

    File_Name = "unknown"


    def __init__(self, resultxml = "all-result.xml"):
        print "Init ResultTool"
        ProcessSync.__init__(self)
        ResultTool.updateBaseDir(getResultDir())
        self.Result_XMLFile = ResultTool.Result_DIR + "/" +resultxml
        self.task = xml_util.parseAllResult(self.Result_XMLFile)
        self.Case_Result = "NotExcuted"
        self.detailItemIndex = 0
        self.caseName = ""

    def continueNextItem(self, itemName, itemDesc="None"):
        self.detailItemIndex += 1
        runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc)

    def setNextItem(self, itemName, itemIndex, itemDesc="None"):
        self.detailItemIndex = itemIndex
        runner_sender.sendActionStart(self.tc.name, self.detailItemIndex, itemName, itemDesc)

    # 通过Script_Activity告诉ResultTool,当前脚本名,用于拼接结果文件保存路径
    @staticmethod
    def setFileName(fileName):
        ResultTool.File_Name = fileName

    @staticmethod
    def checkResultDIR():
        ResultTool.mkCHdir(ResultTool.Result_DIR)
        ResultTool.mkCHdir(ResultTool.Result_DIR_DETAIL)
        ResultTool.mkCHdir(ResultTool.Result_DIR_LOG)
        ResultTool.mkCHdir(ResultTool.Result_DIR_SCREEN)
        ResultTool.mkCHdir(ResultTool.Result_DIR_SCRIPTS)

    @staticmethod
    def mkCHdir(dir):
        #print "mkCHdir,dir=", dir
        if (os.path.exists(dir)):
            return
        #例如:D:/SAT/result_schedule_id_schedule_name_task_number//detail
        #os.path.splite结果:('D:/SAT/result_schedule_id_schedule_name_task_number', 'detail')
        #过滤//多个分割符的情况
        preDir = os.path.split(dir)[0]
        #print "mkdir,preDir=", preDir
        if (not os.path.exists(preDir)):
            ResultTool.mkCHdir(preDir)
        #防止目录字符串最后带有/的情况,会出现两次创建同一个目录
        #例如: D:/SAT/。会创建D:/SAT和D:/SAT/
        if (not os.path.exists(dir)):
            os.mkdir(dir)

    @staticmethod
    def copyInitFile():
        Result_Total_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Total_XSL
        Result_Detail_XSL_Path = ResultTool.Python_Home + Environment.SDK_Relative_Path + ResultTool.Result_Detail_XSL
        shutil.copyfile(Result_Total_XSL_Path, ResultTool.Result_DIR + "/all-result.xsl")
        shutil.copyfile(Result_Detail_XSL_Path, ResultTool.Result_DIR_DETAIL + "/case_result_detail.xsl")

    @staticmethod
    def updateBaseDir(dir):
        print "updateBaseDir,dir=",dir
        ResultTool.Result_DIR = unicode(dir)
        ResultTool.Result_DIR_DETAIL = ResultTool.Result_DIR + "/" + ResultTool.Result_DETAIL
        ResultTool.Result_DIR_LOG = ResultTool.Result_DIR + "/adb_log/"
        ResultTool.Result_DIR_SCREEN = ResultTool.Result_DIR + "/screen/"
        ResultTool.Result_DIR_SCRIPTS = ResultTool.Result_DIR + "/scripts/"
        ResultTool.checkResultDIR()
        ResultTool.copyInitFile()

    @staticmethod
    def setBaseDir(dir):
        setResultDir(dir)


    def getBaseDir(self):
        return ResultTool.Result_DIR

    def getDetailDir(self):
        return ResultTool.Result_DIR_DETAIL

    def getLogDir(self):
        return ResultTool.Result_DIR_LOG

    def getScreenDir(self):
        return ResultTool.Result_DIR_SCREEN

    def addTestCase(self, caseName):
        tcase = self.task.getCaseByName(caseName)
        if (tcase == None):
            self.tc = TestCase()
            self.tc.name = caseName
            self.task.addTestCase(self.tc)
        else:
            self.tc = tcase
        return self.tc

    def getItemByName(self, itemlist, itemname):
        for item in itemlist:
            if (item.name == itemname):
                return item
        return None

    def addItemPicture(self, casename, picpath):
        # print "addItemPicture,",casename, picpath
        destPicDir = os.path.join(self.getScreenDir(), casename)
        self.mkCHdir(destPicDir)
        destPicPath = os.path.join(destPicDir,os.path.basename(picpath))
        if os.path.isdir(destPicPath):
            print u"图片路径为空"
            return ""
        try:
            shutil.copy(picpath,destPicPath)
        except IOError, e:
            print u"拷贝图片失败"
            print e
        return casename + "/" + os.path.basename(picpath), os.path.basename(picpath)

    def saveDetailResult2(self, destxml, itemname, result, picNameList, logName, data="",remark="", caseFinish=0):
        print "saveDetailResult2,picNameList:", picNameList
        print "saveDetailResult:",destxml
        itemList = xml_util.parseDetailResult(destxml.decode('utf-8'))
        if itemname is not None:
            item = self.getItemByName(itemList,itemname)
            if (item == None):
                item =  Item()
                item.name = itemname
                itemList.append(item)
            item.result = result
            del item.screenPathList[:]
            for picName in picNameList:
                item.screenPathList.append("../screen/" + picName)
            if logName <> "":
                item.logPath = "../adb_log/" + logName
            item.data =data
            item.remark = remark
        xml_util.saveDetailResult(destxml.decode('utf-8'), itemList, caseFinish)



    """
    picpathList:图片路径数组.最多存储6张图片
    """
    def saveDetailResult(self, xmlName, itemname, result, picpathList, logpath="", data="", remark="", caseFinish=0):
        xmlPath = ResultTool.Result_DIR_DETAIL + "/"+ xmlName
        # print "saveDetailResult,xmlPath=", xmlPath
        # print "saveDetailResult,picpathList:", picpathList
        if (result == "Fail"):
            self.Case_Result = result
        #兼容之前的参数字符串定义
        picList = []
        if (type(picpathList) == type("") and picpathList <> "")\
                or (type(picpathList) == type(u"") and picpathList <> u""):
            # print u"screen字符串"
            picList.append(picpathList)
        else:
            picList = picpathList
        # print "saveDetailResult,picList:", picList
        rePicNameList = []
        picNameList = []
        for picpath in picList:
            if picpath is None or picpath.__len__() < 5:
                break
            rePicName, picName = self.addItemPicture(self.tc.name, picpath)
            rePicNameList.append(rePicName)
            picNameList.append(picName)
        logname = os.path.basename(logpath)
        self.saveDetailResult2(xmlPath, itemname, result,rePicNameList, logname, data, remark,caseFinish=caseFinish)
        # destPicDir = os.path.join(self.getScreenDir(), self.tc.name)
        # runner_sender.sendActionResult(self.tc.name, self.detailItemIndex, itemname, "", result, remark, destPicDir,"", picNameList,"",data)

    def setCaseFinish(self, xmlName, caseFinish):
        self.saveDetailResult(xmlName,None,"",[],caseFinish=caseFinish)

    def saveCaseResult2(self, result, detailFilePath):
        self.tc.result = result
        self.tc.rdetail = detailFilePath
        #print "saveCaseResult2,Result_XMLFile=", self.Result_XMLFile
        xml_util.saveAllResult(self.task, self.Result_XMLFile.decode('utf-8'))

        #Packet case result
        #兼容制定测试用例名,和不指定测试用例的情况

    '''
    用于保存all-case中的测试结果
    '''
    def saveCaseResult(self,result, detailFileName):
        #detailFilePath = ResultTool.Result_DIR + detailFileName
        detailFilePath = ResultTool.Result_DETAIL + "/"+detailFileName
        self.Case_Result = result
        self.saveCaseResult2(self.Case_Result, detailFilePath)
        # runner_sender.sendCaseResult(self.tc.name, self.detailItemIndex, result, "", "", "")

if __name__ == "__main__":
    # Result_XMLFile = "all-result.xml"
    # detailXml = "test-result.xml"
    # # ResultTool.setBaseDir(u"D:/SAT/中文测试/")
    # reTool = ResultTool(Result_XMLFile)
    # reTool.addTestCase("中文测试")
    # reTool.saveDetailResult(detailXml, "测试", "Pass", "item2.png&item3.png", "log.txt")
    # reTool.saveCaseResult("Fail", detailXml)
    destxml = r"E:\SAT\results\detail\source_select_result.xml"
    itemList = xml_util.parseDetailResult(destxml.decode('utf-8'))
    print "itemList:",itemList
    for item in itemList:
        print "item.name:",item.name
        print "item.data:",item.data
        print "item.remark:",item.remark
        print "item.result:",item.result,type(item.result)
        print "item.screenPathList:",item.screenPathList
        # itemScreenPathList = item.screenPathList
        # imageName =
        print "item.logPath:",item.logPath