# -*- coding:utf-8 -*-
import os
import sys
import time
from multiprocessing import Process
import thread
from multiprocessing.connection import Listener, Client

from ssat_sdk.core.ibinder_listener import *
from ccard_service import *
from tg39_service import *
from chroma_22293_service import *
from redrat_service import *
from sound_service import *
from TC_UB530_service import *
from ssat_sdk.utils import string_util
import subprocess

serviceConfig = ServiceConfig()


class ServiceManager():
    def __init__(self):
        self.ccardService = None
        self.tg39Service = None
        self.c22293Service = None
        self.redratService = None
        self.soundService = None
        self.ub530Service = None
        self.errMsg = ""

    def initService(self, service_name):
        print u"启动Service:", service_name
        if CCardService.Service_Name == service_name:
            self.ccardService = CCardService()
            staus, msg = self.ccardService.initCCard()
            if staus == 0:
                self.errMsg = msg
        elif TG39Service.Service_Name == service_name:
            self.tg39Service = TG39Service()
            staus, msg = self.tg39Service.initTG39()
            if staus == 0:
                self.errMsg = msg
        elif C22293Service.Service_Name == service_name:
            self.c22293Service = C22293Service()
            staus, msg = self.c22293Service.initC22293()
            if staus == 0:
                self.errMsg = msg
        elif RedRatService.Service_Name == service_name:
            self.redratService = RedRatService()
            staus, msg = self.redratService.initRedRat()
            if staus == 0:
                self.errMsg = msg
        elif SoundCollectionService.Service_Name == service_name:
            self.soundService = SoundCollectionService()
            staus, msg = self.soundService.initSoundCollection()
            if staus == 0:
                self.errMsg = msg
        elif string_util.strcmp(TC_UB530Service.Service_Name, service_name):
            baseDir = os.path.dirname(__file__)
            exe = os.path.join(baseDir, "TC_UB530_service.py")
            cmd = "python " + exe + " " + str(os.getpid())
            self.ub530Service = subprocess.Popen(cmd)
            # self.ub530Service = TC_UB530Service()
            # self.ub530Service.startService()

        print u"退出Service:", service_name

    def startSDKServer(self):
        print u"启动SDK服务"
        self.onOff = True
        self.service_process = Process(target=self.startBGServer, args=())
        self.service_process.start()

    def startSDKServer2(self):
        print u"启动SDK服务"
        self.onOff = True
        self.startServerTerminal()

    def startServerTerminal(self):
        print u"启动Server控制台"
        inline = ""
        while inline <> "exit":
            print u"输入命令:"
            inline = raw_input()
            if inline.__len__() < 1:
                continue
            self.parseCmd(inline)

    def startBGServer(self):
        print u"已启动后台服务进程"
        # 采用listener监听服务指令
        while (True):
            binder = ListenerBinder(port=30500)
            self.listener, port = binder.createListener()
            serviceConfig.setSDKListenerPort(port)
            conn = self.listener.accept()
            cmd = conn.recv()
            self.parseCmd(cmdLine=cmd)
            # print u"服务指令:",cmd
            conn.send(u"指令完成")

    def parseCmd(self, cmdLine):
        print u"SDK服务接受指令:", cmdLine
        cmdParam = self.rmNULFrom(cmdLine.split(" "))
        if (cmdParam.__len__() < 2):
            print u"请输入正确命令"
            return False
        command = cmdParam[0]
        param = cmdParam[1]
        self.excuteCmd(command, param)

    def excuteCmd(self, command, param):
        if (command == "start"):
            self.startServiceThread(param)

    def startServiceThread(self, service_name):
        if (service_name == CCardService.Service_Name):
            if (self.ccardService == None) or (self.ccardService.getStatus() == 0):
                thread.start_new_thread(
                    self.initService, (CCardService.Service_Name,))
            else:
                print u"视频采集卡已经启动"

        elif (service_name == TG39Service.Service_Name):
            if self.tg39Service == None or (self.tg39Service.status == 0):
                thread.start_new_thread(
                    self.initService, (TG39Service.Service_Name,))
            else:
                print u"TG39已经启动"

        elif (service_name == C22293Service.Service_Name):
            if self.c22293Service == None or (self.c22293Service.status == 0):
                thread.start_new_thread(
                    self.initService, (C22293Service.Service_Name,))
            else:
                print u"c22293已经启动"
        elif (service_name == "all"):
            if self.ccardService == None or (self.ccardService.status == 0):
                thread.start_new_thread(
                    self.initService, (CCardService.Service_Name,))
            else:
                print u"视频采集卡已经启动"
            if self.tg39Service == None or (self.tg39Service.status == 0):
                thread.start_new_thread(
                    self.initService, (TG39Service.Service_Name,))
            else:
                print u"TG39已经启动"
        elif (service_name == RedRatService.Service_Name):
            if self.redratService == None or (self.redratService.status == 0):
                thread.start_new_thread(
                    self.initService, (RedRatService.Service_Name,))
            else:
                print u"红老鼠已经启动"
        elif (service_name == SoundCollectionService.Service_Name):
            if self.soundService == None or (self.soundService.status == 0):
                thread.start_new_thread(
                    self.initService, (SoundCollectionService.Service_Name,))
            else:
                print u"声音采集器已经启动"
        elif (service_name == TC_UB530Service.Service_Name):
            # self.initService(TC_UB530Service.Service_Name)
            if self.ub530Service is None:
                thread.start_new_thread(
                    self.initService, (TC_UB530Service.Service_Name,))
            else:
                print u"UB530视频采集器已经启动"

    '''
    return:0代表设备服务不可用,1代表设备服务正常运行;-1 代表没有此类设备。
    '''

    def getServiceStatus(self, service_name):
        if TG39Service.Service_Name == service_name:
            if self.tg39Service == None or (self.tg39Service.status == 0):
                return 0
            else:
                return 1
        elif CCardService.Service_Name == service_name:
            if self.ccardService == None or self.ccardService.status == 0:
                return 0
            else:
                return 1
        elif C22293Service.Service_Name == service_name:
            if self.c22293Service == None or self.c22293Service.status == 0:
                return 0
            else:
                return 1
        elif RedRatService.Service_Name == service_name:
            if self.redratService == None or self.redratService.status == 0:
                return 0
            else:
                return 1
        elif (service_name == TC_UB530Service.Service_Name):
            # self.initService(TC_UB530Service.Service_Name)
            if self.ub530Service is None and self.ub530Service.poll() is None:
                return 0
            else:
                return 1
        return -1

    def rmNULFrom(self, strArr):
        destArr = []
        for i in range(strArr.__len__()):
            item = strArr[i]
            if (item <> ''):
                destArr.append(item)
        return destArr


class ServiceClient():
    def __init__(self):
        print u"初始化Server控制台"
        self.port = serviceConfig.getSDKListenerPort()

    def startTerminal(self):
        print u"启动Server控制台"
        inline = ""
        while inline <> "exit":
            print u"输入命令:"
            inline = raw_input()
            if inline.__len__() < 1:
                continue
            self.executeCommand(inline)

    def executeCommand(self, inline):
        # print u"执行命令:", inline
        conn = Client(("localhost", self.port), authkey="sat")
        conn.send(inline)
        result = conn.recv()
        print u"执行结果:", result
        conn.close()


if __name__ == "__main__":
    # if (sys.argv.__len__() > 1) and ("server" == sys.argv[1]):
    #     sManager = ServiceManager()
    #     sManager.startSDKServer()
    # elif (sys.argv.__len__() > 1) and ("client" == sys.argv[1]):
    #     sClient = ServiceClient()
    #     sClient.startTerminal()
    # else:
    #     sManager = ServiceManager()
    #     sManager.startSDKServer2()
    sManager = ServiceManager()
    sManager.startServiceThread("ub530")

    while 1:
        pass