import typing, abc
from System import Guid, IEquatable_1, DateTime
from SIMULTAN.Projects import ProjectData
from System.Collections.ObjectModel import ObservableCollection_1
from System.ComponentModel import INotifyPropertyChanged

class DummyReferenceLocation(IReferenceLocation):
    def __init__(self, globalId: Guid) -> None: ...
    @property
    def GlobalID(self) -> Guid: ...


class GeometricReference(IEquatable_1[GeometricReference]):
    def __init__(self, fileId: int, geometryId: int) -> None: ...
    @classmethod
    @property
    def Empty(cls) -> GeometricReference: ...
    @property
    def FileId(self) -> int: ...
    @FileId.setter
    def FileId(self, value: int) -> int: ...
    @property
    def GeometryId(self) -> int: ...
    @GeometryId.setter
    def GeometryId(self, value: int) -> int: ...
    def GetHashCode(self) -> int: ...
    def __eq__(self, lhs: GeometricReference, rhs: GeometricReference) -> bool: ...
    def __ne__(self, lhs: GeometricReference, rhs: GeometricReference) -> bool: ...
    # Skipped Equals due to it being static, abstract and generic.

    Equals : Equals_MethodGroup
    class Equals_MethodGroup:
        @typing.overload
        def __call__(self, other: GeometricReference) -> bool:...
        @typing.overload
        def __call__(self, obj: typing.Any) -> bool:...



class ILocated(typing.Protocol):
    @property
    def CalledFromLocation(self) -> IReferenceLocation: ...
    @abc.abstractmethod
    def SetCallingLocation(self, _calling_location: IReferenceLocation) -> None: ...


class IReference(typing.Protocol):
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def LocalID(self) -> int: ...


class IReferenceLocation(typing.Protocol):
    @property
    def GlobalID(self) -> Guid: ...


class ISimManagedCollection(ILocated, typing.Protocol):
    @property
    def HasChanges(self) -> bool: ...
    @property
    def LastChange(self) -> DateTime: ...
    @property
    def ProjectData(self) -> ProjectData: ...
    @abc.abstractmethod
    def NotifyChanged(self) -> None: ...


class SimId(IEquatable_1[SimId]):
    @typing.overload
    def __init__(self, globalId: Guid, localId: int) -> None: ...
    @typing.overload
    def __init__(self, localId: int) -> None: ...
    @typing.overload
    def __init__(self, location: IReferenceLocation, localId: int) -> None: ...
    @classmethod
    @property
    def Empty(cls) -> SimId: ...
    @property
    def GlobalId(self) -> Guid: ...
    @property
    def LocalId(self) -> int: ...
    @property
    def Location(self) -> IReferenceLocation: ...
    def GetHashCode(self) -> int: ...
    def __eq__(self, lhs: SimId, rhs: SimId) -> bool: ...
    def __ne__(self, lhs: SimId, rhs: SimId) -> bool: ...
    def ToString(self) -> str: ...
    # Skipped Equals due to it being static, abstract and generic.

    Equals : Equals_MethodGroup
    class Equals_MethodGroup:
        @typing.overload
        def __call__(self, other: SimId) -> bool:...
        @typing.overload
        def __call__(self, obj: typing.Any) -> bool:...



class SimIdGenerator:
    def __init__(self) -> None: ...
    def NextId(self, simObject: SimObjectNew, globalLocation: IReferenceLocation) -> SimId: ...
    def Remove(self, simObject: SimObjectNew) -> None: ...
    def Reserve(self, simObject: SimObjectNew, id: SimId) -> None: ...
    def Reset(self) -> None: ...
    # Skipped GetById due to it being static, abstract and generic.

    GetById : GetById_MethodGroup
    class GetById_MethodGroup:
        def __getitem__(self, t:typing.Type[GetById_1_T1]) -> GetById_1[GetById_1_T1]: ...

        GetById_1_T1 = typing.TypeVar('GetById_1_T1')
        class GetById_1(typing.Generic[GetById_1_T1]):
            GetById_1_T = SimIdGenerator.GetById_MethodGroup.GetById_1_T1
            def __call__(self, id: SimId) -> GetById_1_T:...




class SimManagedCollection_GenericClasses(abc.ABCMeta):
    Generic_SimManagedCollection_GenericClasses_SimManagedCollection_1_ItemT = typing.TypeVar('Generic_SimManagedCollection_GenericClasses_SimManagedCollection_1_ItemT')
    def __getitem__(self, types : typing.Type[Generic_SimManagedCollection_GenericClasses_SimManagedCollection_1_ItemT]) -> typing.Type[SimManagedCollection_1[Generic_SimManagedCollection_GenericClasses_SimManagedCollection_1_ItemT]]: ...

SimManagedCollection : SimManagedCollection_GenericClasses

SimManagedCollection_1_ItemT = typing.TypeVar('SimManagedCollection_1_ItemT')
class SimManagedCollection_1(typing.Generic[SimManagedCollection_1_ItemT], ObservableCollection_1[SimManagedCollection_1_ItemT], ISimManagedCollection, abc.ABC):
    def __init__(self, owner: ProjectData) -> None: ...
    @property
    def CalledFromLocation(self) -> IReferenceLocation: ...
    @CalledFromLocation.setter
    def CalledFromLocation(self, value: IReferenceLocation) -> IReferenceLocation: ...
    @property
    def Count(self) -> int: ...
    @property
    def HasChanges(self) -> bool: ...
    @HasChanges.setter
    def HasChanges(self, value: bool) -> bool: ...
    @property
    def Item(self) -> SimManagedCollection_1_ItemT: ...
    @Item.setter
    def Item(self, value: SimManagedCollection_1_ItemT) -> SimManagedCollection_1_ItemT: ...
    @property
    def LastChange(self) -> DateTime: ...
    @LastChange.setter
    def LastChange(self, value: DateTime) -> DateTime: ...
    @property
    def ProjectData(self) -> ProjectData: ...
    def NotifyChanged(self) -> None: ...
    def ResetChanges(self) -> None: ...
    def SetCallingLocation(self, callingLocation: IReferenceLocation) -> None: ...


class SimNamedObject_GenericClasses(abc.ABCMeta):
    Generic_SimNamedObject_GenericClasses_SimNamedObject_1_TFactory = typing.TypeVar('Generic_SimNamedObject_GenericClasses_SimNamedObject_1_TFactory')
    def __getitem__(self, types : typing.Type[Generic_SimNamedObject_GenericClasses_SimNamedObject_1_TFactory]) -> typing.Type[SimNamedObject_1[Generic_SimNamedObject_GenericClasses_SimNamedObject_1_TFactory]]: ...

SimNamedObject : SimNamedObject_GenericClasses

SimNamedObject_1_TFactory = typing.TypeVar('SimNamedObject_1_TFactory')
class SimNamedObject_1(typing.Generic[SimNamedObject_1_TFactory], SimObjectNew_1[SimNamedObject_1_TFactory]):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, id: SimId) -> None: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimNamedObject_1_TFactory: ...
    @Factory.setter
    def Factory(self, value: SimNamedObject_1_TFactory) -> SimNamedObject_1_TFactory: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, value: str) -> str: ...


class SimObjectNew_GenericClasses(abc.ABCMeta):
    Generic_SimObjectNew_GenericClasses_SimObjectNew_1_TFactory = typing.TypeVar('Generic_SimObjectNew_GenericClasses_SimObjectNew_1_TFactory')
    def __getitem__(self, types : typing.Type[Generic_SimObjectNew_GenericClasses_SimObjectNew_1_TFactory]) -> typing.Type[SimObjectNew_1[Generic_SimObjectNew_GenericClasses_SimObjectNew_1_TFactory]]: ...

class SimObjectNew(SimObjectNew_0, metaclass =SimObjectNew_GenericClasses): ...

class SimObjectNew_0(INotifyPropertyChanged, IReference, abc.ABC):
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def LocalID(self) -> int: ...


SimObjectNew_1_TFactory = typing.TypeVar('SimObjectNew_1_TFactory')
class SimObjectNew_1(typing.Generic[SimObjectNew_1_TFactory], SimObjectNew_0):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, id: SimId) -> None: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimObjectNew_1_TFactory: ...
    @Factory.setter
    def Factory(self, value: SimObjectNew_1_TFactory) -> SimObjectNew_1_TFactory: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def LocalID(self) -> int: ...

