import time, hashlib
from ctypes import pythonapi, c_void_p, py_object
import c4d


####################################################################################################
# Some C4D version dependent implementations
####################################################################################################
def Hash31(s):
    sha = hashlib.sha1()

    sha.update(s.encode('utf-8'))

    r = int(sha.hexdigest(), 16)
    r &= 0x7FFFFFFF

    return r


def GetCoreMessageParam23(msg, id=c4d.BFM_CORE_PAR1):
    vptr = msg.GetVoid(id)

    pythonapi.PyCapsule_GetPointer.restype = c_void_p
    pythonapi.PyCapsule_GetPointer.argtypes = [py_object]

    return pythonapi.PyCapsule_GetPointer(vptr, None)


def GetCoreMessageParamOld(msg, id=c4d.BFM_CORE_PAR1):
    vptr = msg.GetVoid(id)

    pythonapi.PyCObject_AsVoidPtr.restype = c_void_p
    pythonapi.PyCObject_AsVoidPtr.argtypes = [py_object]

    return pythonapi.PyCObject_AsVoidPtr(vptr)


# "Function Pointers"
if c4d.GetC4DVersion() // 1000 < 23:
    if c4d.GeGetCurrentOS() == c4d.OPERATINGSYSTEM_OSX:
        MyHash = Hash31

    else:
        MyHash = hash

    MyTime = time.clock
    GetCoreMessageParam = GetCoreMessageParamOld

else:
    MyHash = Hash31
    MyTime = time.process_time
    GetCoreMessageParam = GetCoreMessageParam23


####################################################################################################
# C4D version dependent constants
####################################################################################################
if c4d.GetC4DVersion() // 1000 > 19:
    COPY_FLAGS_NONE = c4d.COPYFLAGS_NONE

else:
    COPY_FLAGS_NONE = c4d.COPYFLAGS_0
