import typing, abc
from System import Exception, Guid, DateTime, IComparable, IComparable_1, ICloneable, IEquatable_1
from System.Collections import IDictionary
from System.Reflection import MethodBase
from System.Collections.ObjectModel import ObservableCollection_1, ReadOnlyDictionary_2
from SIMULTAN.Data import SimId, SimObjectNew_1, SimManagedCollection_1, IReferenceLocation
from System.Globalization import CultureInfo
from System.Collections.Generic import IEnumerable_1, Dictionary_2
from SIMULTAN.Projects import ProjectData

class DeleteActionAlreadyRegisteredException(Exception):
    def __init__(self, message: str, innerException: Exception) -> None: ...
    @property
    def Data(self) -> IDictionary: ...
    @property
    def HelpLink(self) -> str: ...
    @HelpLink.setter
    def HelpLink(self, value: str) -> str: ...
    @property
    def HResult(self) -> int: ...
    @HResult.setter
    def HResult(self, value: int) -> int: ...
    @property
    def InnerException(self) -> Exception: ...
    @property
    def Message(self) -> str: ...
    @property
    def Source(self) -> str: ...
    @Source.setter
    def Source(self, value: str) -> str: ...
    @property
    def StackTrace(self) -> str: ...
    @property
    def TargetSite(self) -> MethodBase: ...


class ISimTaxonomyElement(typing.Protocol):
    @property
    def Taxonomy(self) -> SimTaxonomy: ...
    @abc.abstractmethod
    def NotifyLocalizationChanged(self) -> None: ...


class SimChildTaxonomyEntryCollection(ObservableCollection_1[SimTaxonomyEntry]):
    def __init__(self, owner: SimTaxonomyEntry) -> None: ...
    @property
    def Count(self) -> int: ...
    @property
    def Item(self) -> SimTaxonomyEntry: ...
    @Item.setter
    def Item(self, value: SimTaxonomyEntry) -> SimTaxonomyEntry: ...


class SimPlaceholderTaxonomyEntryReference(SimTaxonomyEntryReference):
    def __init__(self, placeholderName: str) -> None: ...
    @property
    def PlaceholderName(self) -> str: ...
    @property
    def Target(self) -> SimTaxonomyEntry: ...
    @property
    def TaxonomyEntryId(self) -> SimId: ...


class SimTaxonomy(SimObjectNew_1[SimTaxonomyCollection], ISimTaxonomyElement):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, id: SimId) -> None: ...
    @typing.overload
    def __init__(self, key: str, name: str, description: str, culture: CultureInfo = ...) -> None: ...
    @typing.overload
    def __init__(self, name: str, description: str = ..., culture: CultureInfo = ...) -> None: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Entries(self) -> SimTaxonomyEntryCollection: ...
    @property
    def Factory(self) -> SimTaxonomyCollection: ...
    @Factory.setter
    def Factory(self, value: SimTaxonomyCollection) -> SimTaxonomyCollection: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def IsDeletable(self) -> bool: ...
    @IsDeletable.setter
    def IsDeletable(self, value: bool) -> bool: ...
    @property
    def IsReadonly(self) -> bool: ...
    @IsReadonly.setter
    def IsReadonly(self, value: bool) -> bool: ...
    @property
    def Key(self) -> str: ...
    @Key.setter
    def Key(self, value: str) -> str: ...
    @property
    def Languages(self) -> SimTaxonomyLanguageCollection: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def Localization(self) -> SimTaxonomyLocalization: ...
    @property
    def Taxonomy(self) -> SimTaxonomy: ...
    def GetAllEntriesFlat(self) -> IEnumerable_1[SimTaxonomyEntry]: ...
    def GetTaxonomyEntryByKey(self, key: str) -> SimTaxonomyEntry: ...
    def IsIdentical(self, other: SimTaxonomy) -> bool: ...
    def IsKeyInUse(self, key: str) -> bool: ...
    def NotifyLocalizationChanged(self) -> None: ...


class SimTaxonomyCollection(SimManagedCollection_1[SimTaxonomy]):
    def __init__(self, owner: ProjectData) -> None: ...
    @property
    def CalledFromLocation(self) -> IReferenceLocation: ...
    @property
    def Count(self) -> int: ...
    @property
    def HasChanges(self) -> bool: ...
    @property
    def IsClosing(self) -> bool: ...
    @IsClosing.setter
    def IsClosing(self, value: bool) -> bool: ...
    @property
    def IsLoading(self) -> bool: ...
    @IsLoading.setter
    def IsLoading(self, value: bool) -> bool: ...
    @property
    def IsMergeInProgress(self) -> bool: ...
    @IsMergeInProgress.setter
    def IsMergeInProgress(self, value: bool) -> bool: ...
    @property
    def Item(self) -> SimTaxonomy: ...
    @Item.setter
    def Item(self, value: SimTaxonomy) -> SimTaxonomy: ...
    @property
    def LastChange(self) -> DateTime: ...
    @property
    def ProjectData(self) -> ProjectData: ...
    def FindEntry(self, taxonomyKey: str, entryKey: str, isReadonly: bool = ...) -> SimTaxonomyEntry: ...
    def Merge(self, other: SimTaxonomyCollection) -> Dictionary_2[SimTaxonomy, SimTaxonomy]: ...
    def MergeWithDefaults(self, defaults: SimTaxonomyCollection) -> bool: ...
    def StartLoading(self) -> None: ...
    def StopLoading(self) -> None: ...
    # Skipped GetTaxonomyByKeyOrName due to it being static, abstract and generic.

    GetTaxonomyByKeyOrName : GetTaxonomyByKeyOrName_MethodGroup
    class GetTaxonomyByKeyOrName_MethodGroup:
        @typing.overload
        def __call__(self, key: str, name: str = ..., culture: CultureInfo = ...) -> SimTaxonomy:...
        @typing.overload
        def __call__(self, taxonomies: IEnumerable_1[SimTaxonomy], key: str, name: str = ..., culture: CultureInfo = ...) -> SimTaxonomy:...



class SimTaxonomyEntry(SimObjectNew_1[SimTaxonomyCollection], IComparable, IComparable_1[SimTaxonomyEntry], ISimTaxonomyElement):
    @typing.overload
    def __init__(self, id: SimId, key: str) -> None: ...
    @typing.overload
    def __init__(self, id: SimId, key: str, name: str, description: str = ..., culture: CultureInfo = ...) -> None: ...
    @typing.overload
    def __init__(self, key: str) -> None: ...
    @typing.overload
    def __init__(self, key: str, name: str, description: str = ..., culture: CultureInfo = ...) -> None: ...
    @property
    def Children(self) -> SimChildTaxonomyEntryCollection: ...
    @property
    def Description(self) -> str: ...
    @Description.setter
    def Description(self, value: str) -> str: ...
    @property
    def Factory(self) -> SimTaxonomyCollection: ...
    @Factory.setter
    def Factory(self, value: SimTaxonomyCollection) -> SimTaxonomyCollection: ...
    @property
    def GlobalID(self) -> Guid: ...
    @property
    def Id(self) -> SimId: ...
    @Id.setter
    def Id(self, value: SimId) -> SimId: ...
    @property
    def Key(self) -> str: ...
    @Key.setter
    def Key(self, value: str) -> str: ...
    @property
    def LocalID(self) -> int: ...
    @property
    def Localization(self) -> SimTaxonomyLocalization: ...
    @property
    def Parent(self) -> SimTaxonomyEntry: ...
    @Parent.setter
    def Parent(self, value: SimTaxonomyEntry) -> SimTaxonomyEntry: ...
    @property
    def Taxonomy(self) -> SimTaxonomy: ...
    @Taxonomy.setter
    def Taxonomy(self, value: SimTaxonomy) -> SimTaxonomy: ...
    def Matches(self, taxonomyKey: str, entryKey: str) -> bool: ...
    def NotifyLocalizationChanged(self) -> None: ...
    def OnIsBeingDeleted(self) -> None: ...
    # Skipped CompareTo due to it being static, abstract and generic.

    CompareTo : CompareTo_MethodGroup
    class CompareTo_MethodGroup:
        @typing.overload
        def __call__(self, other: SimTaxonomyEntry) -> int:...
        @typing.overload
        def __call__(self, obj: typing.Any) -> int:...



class SimTaxonomyEntryCollection(ObservableCollection_1[SimTaxonomyEntry]):
    def __init__(self, owner: SimTaxonomy) -> None: ...
    @property
    def Count(self) -> int: ...
    @property
    def Item(self) -> SimTaxonomyEntry: ...
    @Item.setter
    def Item(self, value: SimTaxonomyEntry) -> SimTaxonomyEntry: ...


class SimTaxonomyEntryOrString:
    @typing.overload
    def __init__(self, original: SimTaxonomyEntryOrString) -> None: ...
    @typing.overload
    def __init__(self, taxonomyEntry: SimTaxonomyEntry) -> None: ...
    @typing.overload
    def __init__(self, taxonomyEntry: SimTaxonomyEntryReference) -> None: ...
    @typing.overload
    def __init__(self, text: str) -> None: ...
    @property
    def HasTaxonomyEntry(self) -> bool: ...
    @property
    def HasTaxonomyEntryReference(self) -> bool: ...
    @property
    def TaxonomyEntryReference(self) -> SimTaxonomyEntryReference: ...
    @property
    def Text(self) -> str: ...
    @property
    def TextOrKey(self) -> str: ...
    def GetHashCode(self) -> int: ...
    # Skipped Equals due to it being static, abstract and generic.

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



class SimTaxonomyEntryReference(ICloneable, IEquatable_1[SimTaxonomyEntryReference], IComparable_1[SimTaxonomyEntryReference]):
    @typing.overload
    def __init__(self, other: SimTaxonomyEntryReference) -> None: ...
    @typing.overload
    def __init__(self, target: SimTaxonomyEntry) -> None: ...
    @property
    def Target(self) -> SimTaxonomyEntry: ...
    @property
    def TaxonomyEntryId(self) -> SimId: ...
    def Clone(self) -> typing.Any: ...
    def CompareTo(self, other: SimTaxonomyEntryReference) -> int: ...
    def GetHashCode(self) -> int: ...
    def Matches(self, taxonomyKey: str, entryKey: str) -> bool: ...
    def __eq__(self, a: SimTaxonomyEntryReference, b: SimTaxonomyEntryReference) -> bool: ...
    def __ne__(self, a: SimTaxonomyEntryReference, b: SimTaxonomyEntryReference) -> bool: ...
    # Skipped Equals due to it being static, abstract and generic.

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



class SimTaxonomyEntryReferenceCollection(ObservableCollection_1[SimTaxonomyEntryReference]):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, collection: IEnumerable_1[SimTaxonomyEntryReference]) -> None: ...
    @property
    def Count(self) -> int: ...
    @property
    def Item(self) -> SimTaxonomyEntryReference: ...
    @Item.setter
    def Item(self, value: SimTaxonomyEntryReference) -> SimTaxonomyEntryReference: ...
    def RestoreDefaultTaxonomyReferences(self, projectData: ProjectData) -> None: ...


class SimTaxonomyLanguageCollection(ObservableCollection_1[CultureInfo]):
    def __init__(self, owner: SimTaxonomy) -> None: ...
    @property
    def Count(self) -> int: ...
    @property
    def Item(self) -> CultureInfo: ...
    @Item.setter
    def Item(self, value: CultureInfo) -> CultureInfo: ...


class SimTaxonomyLocalization:
    def __init__(self, owner: ISimTaxonomyElement) -> None: ...
    @property
    def Entries(self) -> ReadOnlyDictionary_2[CultureInfo, SimTaxonomyLocalizationEntry]: ...
    def IsIdenticalTo(self, other: SimTaxonomyLocalization) -> bool: ...
    def Localize(self, culture: CultureInfo = ...) -> SimTaxonomyLocalizationEntry: ...
    # Skipped SetLanguage due to it being static, abstract and generic.

    SetLanguage : SetLanguage_MethodGroup
    class SetLanguage_MethodGroup:
        @typing.overload
        def __call__(self, entry: SimTaxonomyLocalizationEntry) -> None:...
        @typing.overload
        def __call__(self, culture: CultureInfo, name: str, description: str) -> None:...



class SimTaxonomyLocalizationEntry:
    def __init__(self, culture: CultureInfo, name: str = ..., description: str = ...) -> None: ...
    @property
    def Culture(self) -> CultureInfo: ...
    @property
    def Description(self) -> str: ...
    @property
    def IsValid(self) -> bool: ...
    @property
    def Name(self) -> str: ...
    def Equals(self, obj: typing.Any) -> bool: ...
    def GetHashCode(self) -> int: ...
    def ToString(self) -> str: ...


class TaxonomyEntryNotFoundException(Exception):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, message: str) -> None: ...
    @typing.overload
    def __init__(self, message: str, innerException: Exception) -> None: ...
    @property
    def Data(self) -> IDictionary: ...
    @property
    def HelpLink(self) -> str: ...
    @HelpLink.setter
    def HelpLink(self, value: str) -> str: ...
    @property
    def HResult(self) -> int: ...
    @HResult.setter
    def HResult(self, value: int) -> int: ...
    @property
    def InnerException(self) -> Exception: ...
    @property
    def Message(self) -> str: ...
    @property
    def Source(self) -> str: ...
    @Source.setter
    def Source(self, value: str) -> str: ...
    @property
    def StackTrace(self) -> str: ...
    @property
    def TargetSite(self) -> MethodBase: ...

