# This is part of the Python test suite.
# The object is registered when you first run the test suite.
# (and hopefully unregistered once done ;-)

# Ensure the vtables in the tlb are known.
from win32com import universal
from win32com.server.exception import COMException
from win32com.client import gencache
import winerror
from win32com.client import constants
from win32com.server.util import wrap

import pythoncom

pythoncom.__future_currency__ = True
# We use the constants from the module, so must insist on a gencache.
# Otherwise, use of gencache is not necessary (tho still advised)
gencache.EnsureModule("{6BCDCB60-5605-11D0-AE5F-CADD4C000000}", 0, 1, 1)


class PyCOMTest:
    _typelib_guid_ = "{6BCDCB60-5605-11D0-AE5F-CADD4C000000}"
    _typelib_version = 1, 0
    _com_interfaces_ = ["IPyCOMTest"]
    _reg_clsid_ = "{e743d9cd-cb03-4b04-b516-11d3a81c1597}"
    _reg_progid_ = "Python.Test.PyCOMTest"

    def DoubleString(self, str):
        return str * 2

    def DoubleInOutString(self, str):
        return str * 2

    def Fire(self, nID):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetLastVarArgs(self):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetMultipleInterfaces(self, outinterface1, outinterface2):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetSafeArrays(self, attrs, attrs2, ints):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetSetDispatch(self, indisp):
        raise COMException(hresult=winerror.E_NOTIMPL)

    # Result is of type IPyCOMTest
    def GetSetInterface(self, ininterface):
        return wrap(self)

    def GetSetVariant(self, indisp):
        return indisp

    def TestByRefVariant(self, v):
        return v * 2

    def TestByRefString(self, v):
        return v * 2

    # Result is of type IPyCOMTest
    def GetSetInterfaceArray(self, ininterface):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetSetUnknown(self, inunk):
        raise COMException(hresult=winerror.E_NOTIMPL)

    # Result is of type ISimpleCounter
    def GetSimpleCounter(self):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetSimpleSafeArray(self, ints):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def GetStruct(self):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def SetIntSafeArray(self, ints):
        return len(ints)

    def SetLongLongSafeArray(self, ints):
        return len(ints)

    def SetULongLongSafeArray(self, ints):
        return len(ints)

    def SetBinSafeArray(self, buf):
        return len(buf)

    def SetVarArgs(self, *args):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def SetVariantSafeArray(self, vars):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def Start(self):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def Stop(self, nID):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def StopAll(self):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def TakeByRefDispatch(self, inout):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def TakeByRefTypedDispatch(self, inout):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def Test(self, key, inval):
        return not inval

    def Test2(self, inval):
        return inval

    def Test3(self, inval):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def Test4(self, inval):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def Test5(self, inout):
        if inout == constants.TestAttr1:
            return constants.TestAttr1_1
        elif inout == constants.TestAttr1_1:
            return constants.TestAttr1
        else:
            return -1

    def Test6(self, inval):
        return inval

    def TestInOut(self, fval, bval, lval):
        return winerror.S_OK, fval * 2, not bval, lval * 2

    def TestOptionals(self, strArg="def", sval=0, lval=1, dval=3.1400001049041748):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def TestOptionals2(self, dval, strval="", sval=1):
        raise COMException(hresult=winerror.E_NOTIMPL)

    def CheckVariantSafeArray(self, data):
        return 1

    def LongProp(self):
        return self.longval

    def SetLongProp(self, val):
        self.longval = val

    def ULongProp(self):
        return self.ulongval

    def SetULongProp(self, val):
        self.ulongval = val

    def IntProp(self):
        return self.intval

    def SetIntProp(self, val):
        self.intval = val


class PyCOMTestMI(PyCOMTest):
    _typelib_guid_ = "{6BCDCB60-5605-11D0-AE5F-CADD4C000000}"
    _typelib_version = 1, 0
    # Interfaces with a interface name, a real IID, and an IID as a string
    _com_interfaces_ = [
        "IPyCOMTest",
        pythoncom.IID_IStream,
        str(pythoncom.IID_IStorage),
    ]
    _reg_clsid_ = "{F506E9A1-FB46-4238-A597-FA4EB69787CA}"
    _reg_progid_ = "Python.Test.PyCOMTestMI"


if __name__ == "__main__":
    import win32com.server.register

    win32com.server.register.UseCommandLine(PyCOMTest)
    win32com.server.register.UseCommandLine(PyCOMTestMI)
