import ac
import acsys
import sys
import os.path
import platform
import configparser
import threading

# import libraries
if platform.architecture()[0] == "64bit":
    sysdir=os.path.dirname(__file__)+'/stdlib64'
else:
    sysdir=os.path.dirname(__file__)+'/stdlib'

sys.path.insert(0, sysdir)
os.environ['PATH'] = os.environ['PATH'] + ";."

import ctypes
from ctypes import *
from Moza_shared_mem import MozaShared

sharedMem = MozaShared()

pluginVersion = "1.0.1"

timer = 0
event = threading.Event()
stop_thread = False

def updateSharedMemory():
    global sharedMem
    sharedmem = sharedMem.getsharedmem()
    
    while not stop_thread:
        event.wait()
        event.clear()
        sharedmem.numVehicles = ac.getCarsCount()
        sharedmem.focusVehicle = ac.getFocusedCar()
        carIds = range(0, min(sharedmem.numVehicles, 128), 1)
        for carId in carIds:
            if str(ac.getCarName(carId)) == '-1':
                break 			
            else:
                sharedmem.vehicleInfo[carId].carId = carId
                sharedmem.vehicleInfo[carId].driverName = ac.getDriverName(carId).encode('utf-8')
                sharedmem.vehicleInfo[carId].carModel = ac.getCarName(carId).encode('utf-8')
                sharedmem.vehicleInfo[carId].speedMS = ac.getCarState(carId, acsys.CS.SpeedMS)
                sharedmem.vehicleInfo[carId].bestLapMS = ac.getCarState(carId, acsys.CS.BestLap)
                sharedmem.vehicleInfo[carId].lapCount = ac.getCarState(carId, acsys.CS.LapCount)
                sharedmem.vehicleInfo[carId].currentLapInvalid = ac.getCarState(carId, acsys.CS.LapInvalidated)
                sharedmem.vehicleInfo[carId].currentLapTimeMS = ac.getCarState(carId, acsys.CS.LapTime)
                sharedmem.vehicleInfo[carId].lastLapTimeMS = ac.getCarState(carId, acsys.CS.LastLap)
                sharedmem.vehicleInfo[carId].worldPosition = ac.getCarState(carId, acsys.CS.WorldPosition)
                sharedmem.vehicleInfo[carId].isCarInPitline = ac.isCarInPitline(carId)
                sharedmem.vehicleInfo[carId].isCarInPit = ac.isCarInPit(carId)
                sharedmem.vehicleInfo[carId].carLeaderboardPosition = ac.getCarLeaderboardPosition(carId)
                sharedmem.vehicleInfo[carId].carRealTimeLeaderboardPosition = ac.getCarRealTimeLeaderboardPosition(carId)
                sharedmem.vehicleInfo[carId].spLineLength = ac.getCarState(carId, acsys.CS.NormalizedSplinePosition) 
                sharedmem.vehicleInfo[carId].isConnected = ac.isConnected(carId)

def acMain(ac_version):
  global appWindow,sharedMem
 
  appWindow = ac.newApp("Moza")

  ac.setTitle(appWindow, "Moza")
  ac.setSize(appWindow, 300, 40)

  ac.log("Moza Was Here! damage report ?")
  ac.console("Moza Was Here! damage report ?")

  sharedmem = sharedMem.getsharedmem()
  sharedmem.serverName = ac.getServerName().encode('utf-8')
  sharedmem.acInstallPath = os.path.abspath(os.curdir).encode('utf-8')
  sharedmem.isInternalMemoryModuleLoaded = 0
  sharedmem.pluginVersion = pluginVersion.encode('utf-8')
  
  thread = threading.Thread(target=updateSharedMemory)
  thread.daemon = True
  thread.start()
    
  return "Moza"
  
def acShutdown():
  stop_thread = True
  event.set()

def acUpdate(deltaT):
  global timer
  timer += deltaT
  if timer > 0.025:
      event.set()
      timer = 0


