from typing import Tuple, Set, Iterable, List


class LossFactor:
    @property
    def LossFactorValue(self) -> float: ...
    @property
    def IsValidObject(self) -> bool: ...
    def Clone(self) -> LossFactor: ...
    def Dispose(self) -> None: ...


class AdvancedLossFactor(LossFactor):
    @overload
    def __init__(self, other: AdvancedLossFactor): ...
    @overload
    def __init__(self, ballastLossFactorIn: float, lampLumenDepreciationIn: float, lampTiltLossFactorIn: float, luminaireDirtDepreciationIn: float, surfaceDepreciationLossFactorIn: float, temperatureLossFactorIn: float, voltageLossFactorIn: float): ...
    @overload
    def __init__(self): ...
    @property
    def BallastLossFactor(self) -> float: ...
    @BallastLossFactor.setter
    def BallastLossFactor(self, lossFactor: float) -> None: ...
    @property
    def LampLumenDepreciation(self) -> float: ...
    @LampLumenDepreciation.setter
    def LampLumenDepreciation(self, lossFactor: float) -> None: ...
    @property
    def LampTiltLossFactor(self) -> float: ...
    @LampTiltLossFactor.setter
    def LampTiltLossFactor(self, lossFactor: float) -> None: ...
    @property
    def LuminaireDirtDepreciation(self) -> float: ...
    @LuminaireDirtDepreciation.setter
    def LuminaireDirtDepreciation(self, lossFactor: float) -> None: ...
    @property
    def SurfaceDepreciationLossFactor(self) -> float: ...
    @SurfaceDepreciationLossFactor.setter
    def SurfaceDepreciationLossFactor(self, lossFactor: float) -> None: ...
    @property
    def TemperatureLossFactor(self) -> float: ...
    @TemperatureLossFactor.setter
    def TemperatureLossFactor(self, lossFactor: float) -> None: ...
    @property
    def VoltageLossFactor(self) -> float: ...
    @VoltageLossFactor.setter
    def VoltageLossFactor(self, lossFactor: float) -> None: ...


class BasicLossFactor(LossFactor):
    @overload
    def __init__(self, other: BasicLossFactor): ...
    @overload
    def __init__(self, lossFactorIn: float): ...
    @overload
    def __init__(self): ...
    @property
    def LossFactor(self) -> float: ...
    @LossFactor.setter
    def LossFactor(self, lossFactor: float) -> None: ...


class LightShape:
    @property
    def IsValidObject(self) -> bool: ...
    def Clone(self) -> LightShape: ...
    def Dispose(self) -> None: ...


class CircleLightShape(LightShape):
    @overload
    def __init__(self, other: CircleLightShape): ...
    @overload
    def __init__(self, emitDiameter: float): ...
    @overload
    def __init__(self): ...
    @property
    def EmitDiameter(self) -> float: ...
    @EmitDiameter.setter
    def EmitDiameter(self, emitDiameter: float) -> None: ...


class InitialColor:
    @property
    def TemperatureValue(self) -> float: ...
    @property
    def IsValidObject(self) -> bool: ...
    def Clone(self) -> InitialColor: ...
    def Dispose(self) -> None: ...


class CustomInitialColor(InitialColor):
    @overload
    def __init__(self, other: CustomInitialColor): ...
    @overload
    def __init__(self, temperature: float): ...
    @property
    def Temperature(self) -> float: ...
    @Temperature.setter
    def Temperature(self, temperatureValue: float) -> None: ...


class LightDistribution:
    @property
    def IsValidObject(self) -> bool: ...
    def Clone(self) -> LightDistribution: ...
    def Dispose(self) -> None: ...


class HemisphericalLightDistribution(LightDistribution):
    @overload
    def __init__(self, other: HemisphericalLightDistribution): ...
    @overload
    def __init__(self): ...


class InitialIntensity:
    @property
    def InitialIntensityValue(self) -> float: ...
    @property
    def IsValidObject(self) -> bool: ...
    def Clone(self) -> InitialIntensity: ...
    def Dispose(self) -> None: ...


class InitialFluxIntensity(InitialIntensity):
    @overload
    def __init__(self, other: InitialFluxIntensity): ...
    @overload
    def __init__(self, flux: float): ...
    @property
    def Flux(self) -> float: ...
    @Flux.setter
    def Flux(self, value: float) -> None: ...


class InitialIlluminanceIntensity(InitialIntensity):
    @overload
    def __init__(self, other: InitialIlluminanceIntensity): ...
    @overload
    def __init__(self, distance: float, illuminance: float): ...
    @property
    def Distance(self) -> float: ...
    @Distance.setter
    def Distance(self, value: float) -> None: ...
    @property
    def Illuminance(self) -> float: ...
    @Illuminance.setter
    def Illuminance(self, value: float) -> None: ...


class InitialLuminousIntensity(InitialIntensity):
    @overload
    def __init__(self, other: InitialLuminousIntensity): ...
    @overload
    def __init__(self, luminosity: float): ...
    @property
    def Luminosity(self) -> float: ...
    @Luminosity.setter
    def Luminosity(self, value: float) -> None: ...


class InitialWattageIntensity(InitialIntensity):
    @overload
    def __init__(self, other: InitialWattageIntensity): ...
    @overload
    def __init__(self, efficacy: float, wattage: float): ...
    @property
    def Efficacy(self) -> float: ...
    @Efficacy.setter
    def Efficacy(self, value: float) -> None: ...
    @property
    def Wattage(self) -> float: ...
    @Wattage.setter
    def Wattage(self, value: float) -> None: ...


class LightFamily:
    @property
    def IsValidObject(self) -> bool: ...
    def GetLightFamily(document: Document) -> LightFamily: ...
    def GetLightShapeStyle(self) -> LightShapeStyle: ...
    def SetLightShapeStyle(self, lightShapeStyle: LightShapeStyle) -> None: ...
    def GetLightDistributionStyle(self) -> LightDistributionStyle: ...
    def SetLightDistributionStyle(self, lightDistributionStyle: LightDistributionStyle) -> None: ...
    def GetLightSourceTransform(self) -> Transform: ...
    def GetNumberOfLightTypes(self) -> int: ...
    def GetLightTypeName(self, index: int) -> str: ...
    def GetLightType(self, index: int) -> LightType: ...
    def Dispose(self) -> None: ...


class LightType:
    @property
    def ColorFilter(self) -> Color: ...
    @ColorFilter.setter
    def ColorFilter(self, colorFilter: Color) -> None: ...
    @property
    def DimmingColor(self) -> LightDimmingColor: ...
    @DimmingColor.setter
    def DimmingColor(self, dimmingColor: LightDimmingColor) -> None: ...
    @property
    def IsValidObject(self) -> bool: ...
    def GetLightType(document: Document, typeId: ElementId) -> LightType: ...
    def GetLightTypeFromInstance(document: Document, instanceId: ElementId) -> LightType: ...
    def GetLightShape(self) -> LightShape: ...
    def SetLightShape(self, lightShape: LightShape) -> None: ...
    def GetLightDistribution(self) -> LightDistribution: ...
    def SetLightDistribution(self, lightDistribution: LightDistribution) -> None: ...
    def GetInitialColor(self) -> InitialColor: ...
    def SetInitialColor(self, initialColor: InitialColor) -> None: ...
    def GetInitialIntensity(self) -> InitialIntensity: ...
    def SetInitialIntensity(self, initialIntensity: InitialIntensity) -> None: ...
    def GetLossFactor(self) -> LossFactor: ...
    def SetLossFactor(self, lossFactor: LossFactor) -> None: ...
    def Dispose(self) -> None: ...


class LightGroupManager:
    @property
    def IsValidObject(self) -> bool: ...
    def GetLightGroupManager(document: Document) -> LightGroupManager: ...
    def CreateGroup(self, name: str) -> LightGroup: ...
    def DeleteGroup(self, groupId: ElementId) -> None: ...
    def GetGroups(self) -> List[LightGroup]: ...
    def IsLightGroupOn(self, viewId: ElementId, groupId: ElementId) -> bool: ...
    def SetLightGroupOn(self, viewId: ElementId, groupId: ElementId, turnOn: bool) -> None: ...
    def IsLightOn(self, viewId: ElementId, lightId: ElementId) -> bool: ...
    def SetLightOn(self, viewId: ElementId, lightId: ElementId, turnOn: bool) -> None: ...
    def GetLightDimmer(self, viewId: ElementId, lightId: ElementId) -> float: ...
    def SetLightDimmer(self, viewId: ElementId, lightId: ElementId, dimmingValue: float) -> None: ...
    def Dispose(self) -> None: ...


class LightGroup:
    @property
    def Name(self) -> str: ...
    @Name.setter
    def Name(self, name: str) -> None: ...
    @property
    def Id(self) -> ElementId: ...
    @property
    def IsValidObject(self) -> bool: ...
    def AddLight(self, lightId: ElementId) -> None: ...
    def RemoveLight(self, lightId: ElementId) -> None: ...
    def GetLights(self) -> ICollection: ...
    def Dispose(self) -> None: ...


class LineLightShape(LightShape):
    @overload
    def __init__(self, other: LineLightShape): ...
    @overload
    def __init__(self, emitLength: float): ...
    @overload
    def __init__(self): ...
    @property
    def EmitLength(self) -> float: ...
    @EmitLength.setter
    def EmitLength(self, emitLength: float) -> None: ...


class LightDimmingColor:
    #None = 0
    Incandescent = 1


class LightDistributionStyle:
    Spherical = 0
    Hemispherical = 1
    Spot = 2
    PhotometricWeb = 3


class LightShapeStyle:
    Point = 0
    Line = 1
    Rectangle = 2
    Circle = 3


class PhotometricWebLightDistribution(LightDistribution):
    @overload
    def __init__(self, other: PhotometricWebLightDistribution): ...
    @overload
    def __init__(self, photometricWebFile: str, tiltAngle: float): ...
    @property
    def PhotometricWebFile(self) -> str: ...
    @PhotometricWebFile.setter
    def PhotometricWebFile(self, photometricWebFile: str) -> None: ...
    @property
    def TiltAngle(self) -> float: ...
    @TiltAngle.setter
    def TiltAngle(self, angle: float) -> None: ...


class PointLightShape(LightShape):
    @overload
    def __init__(self, other: PointLightShape): ...
    @overload
    def __init__(self): ...


class PresetInitialColor(InitialColor):
    @overload
    def __init__(self, other: PresetInitialColor): ...
    @overload
    def __init__(self, presetIn: ColorPreset): ...
    @property
    def Preset(self) -> ColorPreset: ...
    @Preset.setter
    def Preset(self, preset: ColorPreset) -> None: ...


class ColorPreset:
    D65 = 0
    D50 = 1
    Halogen = 2
    Incandescent = 3
    Xenon = 4
    Quartz = 5
    FluorescentWarm = 6
    FluorescentCool = 7
    FluorescentWhite = 8
    FluorescentDayLight = 9
    FluorescentLightWhite = 10
    MetalHalide = 11
    HighPressureSodium = 12
    LowPressureSodium = 13
    Mercury = 14
    PhosphorMercury = 15


class RectangleLightShape(LightShape):
    @overload
    def __init__(self, other: RectangleLightShape): ...
    @overload
    def __init__(self, emitLength: float, emitWidth: float): ...
    @overload
    def __init__(self): ...
    @property
    def EmitLength(self) -> float: ...
    @EmitLength.setter
    def EmitLength(self, emitLength: float) -> None: ...
    @property
    def EmitWidth(self) -> float: ...
    @EmitWidth.setter
    def EmitWidth(self, emitWidth: float) -> None: ...


class SphericalLightDistribution(LightDistribution):
    @overload
    def __init__(self, other: SphericalLightDistribution): ...
    @overload
    def __init__(self): ...


class SpotLightDistribution(LightDistribution):
    @overload
    def __init__(self, other: SpotLightDistribution): ...
    @overload
    def __init__(self, spotBeamAngle: float, spotFieldAngle: float, tiltAngle: float): ...
    @overload
    def __init__(self): ...
    @property
    def SpotBeamAngle(self) -> float: ...
    @SpotBeamAngle.setter
    def SpotBeamAngle(self, angle: float) -> None: ...
    @property
    def SpotFieldAngle(self) -> float: ...
    @SpotFieldAngle.setter
    def SpotFieldAngle(self, angle: float) -> None: ...
    @property
    def TiltAngle(self) -> float: ...
    @TiltAngle.setter
    def TiltAngle(self, angle: float) -> None: ...
