import os
import sys
import time
import threading
import platform 

if sys.platform == 'win32':
    from vibolib.platform.win32 import Browser,Platform
    import SOAPpy.SOAPTypes
elif sys.platform== 'linux2':
    if os.path.isfile("/mnt/hdd/VestelBayiClient/bayiclient/init.sh"):
        from vibolib.platform.stb4k import Browser,Platform
    elif os.path.isfile("/conf/mb130_swprofile.bin"):
        from vibolib.platform.mb135 import Browser,Platform
    elif os.path.isfile("/conf/mb120_swprofile.bin"):
        from vibolib.platform.mb120 import Browser,Platform
    elif 'x86_64' == platform.machine():
        from vibolib.platform.linuxPC import Browser,Platform
else:
    from vibolib.platform.generic import Browser,Platform

from xml.dom import minidom

from vibolib import g           #global varibales
from vibolib.xmds import XMDS
from vibolib.config import Config
from vibolib.logger import Logger
from vibolib.webserver import WebServer
from vibolib.statlogger import StatLogger
from vibolib.logagent import LogAgent
from vibolib.registeragent import RegisterAgent
from vibolib.scheduleagent import ScheduleAgent
from vibolib.libraryagent import LibraryAgent
from vibolib.offlineagent import OfflineAgent
from vibolib.requiredfilesagent import RFAgent
from vibolib.schedulemanager import ScheduleManager
from vibolib.websockethandler import WebSocketHandler
from vibolib.fileutils import File
from vibolib.viboclient import ViboClient

from collections import defaultdict
from wss import WSServer
from wss import HttpdServer

import socket
from threading import Thread
from vibolib.websocketserver import SimpleWebSocketServer
from tvlist import TVList,VideoList

import SimpleHTTPServer
import SocketServer

class VIBO():

    def __init__(self):
        g.init()
        g.platform = Platform()
        g.config = Config()
        g.md5Cache = defaultdict(File)
        g.logger = Logger(g.config.LogLevel)
        g.logger.start()
        g.info("Logger initialized") 

        g.webserver = WebServer()  #websocketserver
        g.webserver.start()
        while not g.webServerReady:
            time.sleep(10)
            g.audit('Waiting WS server to be ready')
      
        g.audit('WS server is ready')

        g.statlogger = StatLogger()
        
        g.xmds = XMDS()
        
        # check config.xml exist and its connection
        openFile = 'source/VsignTVClient.html'

        g.enableScheduler = True
        if g.isFirstTimeRegistration():
            g.audit("OnlinePackage is active. First Time Registration.")
            #openFile = 'source/VsignOptions.html'
            g.enableScheduler = False
        else:
            g.LoadXmdsConfig('vsign.config.xml')
            if g.config.offlineCheck == "True" :
                g.config.offline = True
            else:
                g.config.offline = False

            if g.isOfflinePackage(): 
                g.audit("OfflinePackage is active. No need to Register")
                #openFile = 'source/VsignTVClient.html'
            else:
                g.audit("OnlinePackage is active. Already registered.")
                try:
                    g.audit("config.IPAddress : "  + g.config.IPAddress)
                    g.audit("config.wsdlFile :" + g.config.wsdlFile )
                    g.audit("config.serverKey :" + g.config.serverKey)

                # check registration status before play again
                # if error occurs, check previous file

                    try:
                        response = g.xmds.register()
                        if response.strip():
                            f = open(g.config.mountedPath  + "/vsignplayer.config.xml","w")
                            f.write(response)
                            f.close()
                            time.sleep(3)
                    except Exception,err:
                        g.exprint()

                    #if g.isAlreadyLicensed():
                    #   openFile = "source/VsignTVClient.html"
                    #else:
                    #   openFile = "source/VsignTVClient.html"
                
                except Exception,err:
                    g.exprint()


        g.viboclient = ViboClient()
        if g.config.sync_state =="True":
            g.viboclient.syncStateControl()
        g.wss = WSServer()
        g.wss.start()
        g.httpd=HttpdServer()
        g.httpd.start()
        time.sleep(3)

        g.viboclient.setVersion()

##        g.config.oprint()

        if  g.isOnlinePackage():
            lock = threading.Lock()

            g.schedulemanager = ScheduleManager(lock,g.wss)
            g.schedulemanager.start()

            g.registerAgent = RegisterAgent(g.wss)
            g.registerAgent.start()

            g.scheduleagent = ScheduleAgent(lock)
            g.scheduleagent.start()

            g.requiredfilesagent = RFAgent()
            g.requiredfilesagent.start()

            g.libraryagent = LibraryAgent()
            g.libraryagent.start()

            g.logagent = LogAgent()
            g.logagent.start()

            time.sleep(1)
            g.offlineagent = OfflineAgent()
            g.offlineagent.start()

            while True:
                time.sleep(120)

    def exit(self):
        sys.exit()

if __name__ == '__main__':
    threading.current_thread().name = 'ViboMain'
    os.nice(19)
    vibo = VIBO()
