import typing
from System.ComponentModel import INotifyPropertyChanged
from SIMULTAN.Data.Assets import ResourceFileEntry
from System.Collections.ObjectModel import ObservableCollection_1
from SIMULTAN.Projects import ResourceReference, ProjectData
from SIMULTAN.Data.SimMath import SimPoint, SimPoint3D, SimColor
from SIMULTAN.Data import ILocated, IReferenceLocation
from System.IO import FileInfo
from SIMULTAN.Utils.ElevationProvider import IBulkElevationProvider
from SIMULTAN.Data.ValueMappings import SimValueMapping
from System import MulticastDelegate, IAsyncResult, AsyncCallback
from System.Reflection import MethodInfo

class GeoMap(INotifyPropertyChanged):
    def __init__(self, geoMapFile: ResourceFileEntry) -> None: ...
    @property
    def GeoMapFile(self) -> ResourceFileEntry: ...
    @GeoMapFile.setter
    def GeoMapFile(self, value: ResourceFileEntry) -> ResourceFileEntry: ...
    @property
    def GeoReferences(self) -> ObservableCollection_1[ImageGeoReference]: ...
    @GeoReferences.setter
    def GeoReferences(self, value: ObservableCollection_1[ImageGeoReference]) -> ObservableCollection_1[ImageGeoReference]: ...
    @property
    def MapImageRes(self) -> ResourceReference: ...
    @MapImageRes.setter
    def MapImageRes(self, value: ResourceReference) -> ResourceReference: ...


class ImageGeoReference(INotifyPropertyChanged):
    @typing.overload
    def __init__(self) -> None: ...
    @typing.overload
    def __init__(self, imagePosition: SimPoint, geoReference: SimPoint3D) -> None: ...
    @property
    def ImagePosition(self) -> SimPoint: ...
    @ImagePosition.setter
    def ImagePosition(self, value: SimPoint) -> SimPoint: ...
    @property
    def ReferencePoint(self) -> SimPoint3D: ...
    @ReferencePoint.setter
    def ReferencePoint(self, value: SimPoint3D) -> SimPoint3D: ...


class SitePlannerBuilding(INotifyPropertyChanged):
    def __init__(self, ID: int, geometryModelRes: ResourceReference) -> None: ...
    @property
    def CustomColor(self) -> SimColor: ...
    @CustomColor.setter
    def CustomColor(self, value: SimColor) -> SimColor: ...
    @property
    def GeometryModelRes(self) -> ResourceReference: ...
    @GeometryModelRes.setter
    def GeometryModelRes(self, value: ResourceReference) -> ResourceReference: ...
    @property
    def ID(self) -> int: ...
    @ID.setter
    def ID(self, value: int) -> int: ...
    @property
    def Project(self) -> SitePlannerProject: ...
    @Project.setter
    def Project(self, value: SitePlannerProject) -> SitePlannerProject: ...


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


class SitePlannerManager(ILocated):
    def __init__(self, projectData: ProjectData) -> None: ...
    @property
    def CalledFromLocation(self) -> IReferenceLocation: ...
    @CalledFromLocation.setter
    def CalledFromLocation(self, value: IReferenceLocation) -> IReferenceLocation: ...
    @property
    def GeoMaps(self) -> ObservableCollection_1[GeoMap]: ...
    @GeoMaps.setter
    def GeoMaps(self, value: ObservableCollection_1[GeoMap]) -> ObservableCollection_1[GeoMap]: ...
    @property
    def ProjectData(self) -> ProjectData: ...
    @property
    def SitePlannerProjects(self) -> SitePlannerProjectsCollection: ...
    def ClearRecord(self) -> None: ...
    def CloseSitePlannerMap(self, map: GeoMap) -> None: ...
    def CloseSitePlannerProject(self, proj: SitePlannerProject) -> None: ...
    def GenerateUniqueBuildingID(self) -> int: ...
    def GetGeoMapByFile(self, file: FileInfo) -> GeoMap: ...
    def GetSitePlannerProjectByFile(self, file: FileInfo) -> SitePlannerProject: ...
    def IsMapFileOpen(self, file: FileInfo) -> bool: ...
    def IsSitePlannerFileOpen(self, file: FileInfo) -> bool: ...
    def OpenSitePlannerMap(self, map: GeoMap) -> None: ...
    def OpenSitePlannerProject(self, proj: SitePlannerProject) -> None: ...
    def SetCallingLocation(self, caller: IReferenceLocation) -> None: ...
    # Skipped IsFileOpen due to it being static, abstract and generic.

    IsFileOpen : IsFileOpen_MethodGroup
    class IsFileOpen_MethodGroup:
        @typing.overload
        def __call__(self, file: FileInfo) -> bool:...
        @typing.overload
        def __call__(self, file: ResourceFileEntry) -> bool:...



class SitePlannerMap(INotifyPropertyChanged):
    def __init__(self, geoMapRes: ResourceReference) -> None: ...
    @property
    def ElevationProvider(self) -> IBulkElevationProvider: ...
    @ElevationProvider.setter
    def ElevationProvider(self, value: IBulkElevationProvider) -> IBulkElevationProvider: ...
    @property
    def ElevationProviderTypeName(self) -> str: ...
    @ElevationProviderTypeName.setter
    def ElevationProviderTypeName(self, value: str) -> str: ...
    @property
    def GeoMapRes(self) -> ResourceReference: ...
    @GeoMapRes.setter
    def GeoMapRes(self, value: ResourceReference) -> ResourceReference: ...
    @property
    def GridCellSize(self) -> int: ...
    @GridCellSize.setter
    def GridCellSize(self, value: int) -> int: ...


class SitePlannerProject(INotifyPropertyChanged):
    def __init__(self, projectFile: ResourceFileEntry) -> None: ...
    @property
    def ActiveValueMapping(self) -> SimValueMapping: ...
    @ActiveValueMapping.setter
    def ActiveValueMapping(self, value: SimValueMapping) -> SimValueMapping: ...
    @property
    def Buildings(self) -> SitePlannerBuildingCollection: ...
    @Buildings.setter
    def Buildings(self, value: SitePlannerBuildingCollection) -> SitePlannerBuildingCollection: ...
    @property
    def Factory(self) -> SitePlannerManager: ...
    @Factory.setter
    def Factory(self, value: SitePlannerManager) -> SitePlannerManager: ...
    @property
    def IsValueMappingEnabled(self) -> bool: ...
    @IsValueMappingEnabled.setter
    def IsValueMappingEnabled(self, value: bool) -> bool: ...
    @property
    def Maps(self) -> ObservableCollection_1[SitePlannerMap]: ...
    @Maps.setter
    def Maps(self, value: ObservableCollection_1[SitePlannerMap]) -> ObservableCollection_1[SitePlannerMap]: ...
    @property
    def SitePlannerFile(self) -> ResourceFileEntry: ...
    @SitePlannerFile.setter
    def SitePlannerFile(self, value: ResourceFileEntry) -> ResourceFileEntry: ...
    @property
    def ValueMappings(self) -> ObservableCollection_1[SimValueMapping]: ...
    def ContainsGeoMap(self, geomap: ResourceFileEntry) -> bool: ...
    def ContainsGeometryModel(self, simgeo: ResourceFileEntry) -> bool: ...


class SitePlannerProjectClosedEventHandler(MulticastDelegate):
    def __init__(self, object: typing.Any, method: int) -> None: ...
    @property
    def Method(self) -> MethodInfo: ...
    @property
    def Target(self) -> typing.Any: ...
    def BeginInvoke(self, sender: typing.Any, project: SitePlannerProject, callback: AsyncCallback, object: typing.Any) -> IAsyncResult: ...
    def EndInvoke(self, result: IAsyncResult) -> None: ...
    def Invoke(self, sender: typing.Any, project: SitePlannerProject) -> None: ...


class SitePlannerProjectOpenedEventHandler(MulticastDelegate):
    def __init__(self, object: typing.Any, method: int) -> None: ...
    @property
    def Method(self) -> MethodInfo: ...
    @property
    def Target(self) -> typing.Any: ...
    def BeginInvoke(self, sender: typing.Any, project: SitePlannerProject, callback: AsyncCallback, object: typing.Any) -> IAsyncResult: ...
    def EndInvoke(self, result: IAsyncResult) -> None: ...
    def Invoke(self, sender: typing.Any, project: SitePlannerProject) -> None: ...


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

