from pythoncom import (
    CreateBindCtx as create_bind_context_com_interface,
    IID_IDispatch as dispatch_com_interface_iid,
    GetRunningObjectTable as get_running_object_table_com_interface,
)

import pythoncom
from win32com.client import Dispatch as dispatch, GetActiveObject, gencache, Moniker


catia=None


def get_catia_instances():
    """
    Returns a list of the running Microsoft Excel application
    instances as component object model (COM) objects.
    """
    running_object_table_com_interface = get_running_object_table_com_interface()
    bind_context_com_interface = create_bind_context_com_interface()
    excel_application_class_clsid = "{87FD6F40-E252-11D5-8040-0010B5FA1031}"
    excel_application_clsid = "{7D2C8116-DC44-0000-0280-030BA6000000}"
    excel_instance_com_objects = []
    for moniker_com_interface in running_object_table_com_interface:
        display_name = moniker_com_interface.GetDisplayName(
            bind_context_com_interface, None
        )
        if excel_application_class_clsid not in display_name:
            continue
        unknown_com_interface = running_object_table_com_interface.GetObject(
            moniker_com_interface
        )
        dispatch_com_interface = unknown_com_interface.QueryInterface(
            dispatch_com_interface_iid
        )
        dispatch_clsid = str(
            object=dispatch_com_interface.GetTypeInfo().GetTypeAttr().iid
        )
        # print("Catia Class CLSID",display_name,"App Clsid",dispatch_clsid)
        if dispatch_clsid != excel_application_clsid:
            continue
        excel_instance_com_object = dispatch(dispatch_com_interface)
        excel_instance_com_object.Caption = "asdaa"
        excel_instance_com_objects.append(excel_instance_com_object)
    return excel_instance_com_objects


def get_excel_instances():
    """
    Returns a list of the running Microsoft Excel application
    instances as component object model (COM) objects.
    """
    running_object_table_com_interface = get_running_object_table_com_interface()
    bind_context_com_interface = create_bind_context_com_interface()
    excel_application_class_clsid = "{87FD6F40-E252-11D5-8040-0010B5FA1031}"
    excel_application_clsid = "{7D2C8116-DC44-0000-0280-030BA6000000}"
    excel_instance_com_objects = []
    for moniker_com_interface in running_object_table_com_interface:
        display_name = moniker_com_interface.GetDisplayName(
            bind_context_com_interface, None
        )
        print(display_name)
        if excel_application_class_clsid not in display_name:
            continue
        unknown_com_interface = running_object_table_com_interface.GetObject(
            moniker_com_interface
        )
        dispatch_com_interface = unknown_com_interface.QueryInterface(
            dispatch_com_interface_iid
        )
        dispatch_clsid = str(
            object=dispatch_com_interface.GetTypeInfo().GetTypeAttr().iid
        )
        print(dispatch_com_interface.__dir__())
        if dispatch_clsid != excel_application_clsid:
            continue
        excel_instance_com_object = dispatch(dispatch=dispatch_com_interface)

        excel_instance_com_objects.append(excel_instance_com_object)
    return excel_instance_com_objects


# import uuid
# obj = None
# rot = pythoncom.GetRunningObjectTable()
# rotenum = rot.EnumRunning()
# while True:
#   monikers = rotenum.Next()
#   print(monikers)
#   if not monikers: break
#   ctx = pythoncom.CreateBindCtx(0)
#   name = monikers[0].GetDisplayName(ctx, None);
#   obj = rot.GetObject(monikers[0])
#   # obj1=monikers[0].BindToObject(ctx, None, pythoncom.IID_IDispatch)
#   dispatch(obj.QueryInterface(pythoncom.IID_IDispatch)).Application.Caption="aadadsadasd"
#   print(dispatch(obj.QueryInterface(pythoncom.IID_IDispatch)).Application.Caption)
#   # break

# # excel_instances = get_excel_instances()
# input()
