# Auto-generated by `python -m gen` — do not edit manually.

from typing import TYPE_CHECKING, Literal

import bpy

from ...builder import BaseNode, SocketAccessor

from ...types import (
    InputColor,
    InputFloat,
    InputShader,
    InputVector,
)

from ...builder.socket import (
    ColorSocket,
    FloatSocket,
    ShaderSocket,
    VectorSocket,
)


class AovOutput(BaseNode):
    """
        Arbitrary Output Variables.
    Provide custom render passes for arbitrary shader node outputs

        Parameters
        ----------
        color : InputColor
            Color
        value : InputFloat
            Value

        Inputs
        ------
        i.color : ColorSocket
            Color
        i.value : FloatSocket
            Value
    """

    _bl_idname = "ShaderNodeOutputAOV"
    node: bpy.types.ShaderNodeOutputAOV

    class _Inputs(SocketAccessor):
        color: ColorSocket
        """Color"""
        value: FloatSocket
        """Value"""

    class _Outputs(SocketAccessor):
        pass

    if TYPE_CHECKING:

        @property
        def i(self) -> _Inputs: ...
        @property
        def o(self) -> _Outputs: ...

    def __init__(
        self,
        color: InputColor = None,
        value: InputFloat = 0.0,
        *,
        aov_name: str = "",
    ):
        super().__init__()
        key_args = {"Color": color, "Value": value}
        self.aov_name = aov_name
        self._establish_links(**key_args)

    @property
    def aov_name(self) -> str:
        return self.node.aov_name

    @aov_name.setter
    def aov_name(self, value: str):
        self.node.aov_name = value


class LightOutput(BaseNode):
    """
    Output light information to a light object

    Parameters
    ----------
    surface : InputShader
        Surface

    Inputs
    ------
    i.surface : ShaderSocket
        Surface
    """

    _bl_idname = "ShaderNodeOutputLight"
    node: bpy.types.ShaderNodeOutputLight

    class _Inputs(SocketAccessor):
        surface: ShaderSocket
        """Surface"""

    class _Outputs(SocketAccessor):
        pass

    if TYPE_CHECKING:

        @property
        def i(self) -> _Inputs: ...
        @property
        def o(self) -> _Outputs: ...

    def __init__(
        self,
        surface: InputShader = None,
        *,
        is_active_output: bool = False,
        target: Literal["ALL", "EEVEE", "CYCLES"] = "ALL",
    ):
        super().__init__()
        key_args = {"Surface": surface}
        self.is_active_output = is_active_output
        self.target = target
        self._establish_links(**key_args)

    @property
    def is_active_output(self) -> bool:
        return self.node.is_active_output

    @is_active_output.setter
    def is_active_output(self, value: bool):
        self.node.is_active_output = value

    @property
    def target(self) -> Literal["ALL", "EEVEE", "CYCLES"]:
        return self.node.target

    @target.setter
    def target(self, value: Literal["ALL", "EEVEE", "CYCLES"]):
        self.node.target = value


class LineStyleOutput(BaseNode):
    """
    Control the mixing of texture information into the base color of line styles

    Parameters
    ----------
    color : InputColor
        Color
    color_fac : InputFloat
        Color Fac
    alpha : InputFloat
        Alpha
    alpha_fac : InputFloat
        Alpha Fac

    Inputs
    ------
    i.color : ColorSocket
        Color
    i.color_fac : FloatSocket
        Color Fac
    i.alpha : FloatSocket
        Alpha
    i.alpha_fac : FloatSocket
        Alpha Fac
    """

    _bl_idname = "ShaderNodeOutputLineStyle"
    node: bpy.types.ShaderNodeOutputLineStyle

    class _Inputs(SocketAccessor):
        color: ColorSocket
        """Color"""
        color_fac: FloatSocket
        """Color Fac"""
        alpha: FloatSocket
        """Alpha"""
        alpha_fac: FloatSocket
        """Alpha Fac"""

    class _Outputs(SocketAccessor):
        pass

    if TYPE_CHECKING:

        @property
        def i(self) -> _Inputs: ...
        @property
        def o(self) -> _Outputs: ...

    def __init__(
        self,
        color: InputColor = None,
        color_fac: InputFloat = 1.0,
        alpha: InputFloat = 1.0,
        alpha_fac: InputFloat = 1.0,
        *,
        is_active_output: bool = False,
        target: Literal["ALL", "EEVEE", "CYCLES"] = "ALL",
        blend_type: Literal[
            "MIX",
            "DARKEN",
            "MULTIPLY",
            "BURN",
            "LIGHTEN",
            "SCREEN",
            "DODGE",
            "ADD",
            "OVERLAY",
            "SOFT_LIGHT",
            "LINEAR_LIGHT",
            "DIFFERENCE",
            "EXCLUSION",
            "SUBTRACT",
            "DIVIDE",
            "HUE",
            "SATURATION",
            "COLOR",
            "VALUE",
        ] = "MIX",
        use_alpha: bool = False,
        use_clamp: bool = False,
    ):
        super().__init__()
        key_args = {
            "Color": color,
            "Color Fac": color_fac,
            "Alpha": alpha,
            "Alpha Fac": alpha_fac,
        }
        self.is_active_output = is_active_output
        self.target = target
        self.blend_type = blend_type
        self.use_alpha = use_alpha
        self.use_clamp = use_clamp
        self._establish_links(**key_args)

    @property
    def is_active_output(self) -> bool:
        return self.node.is_active_output

    @is_active_output.setter
    def is_active_output(self, value: bool):
        self.node.is_active_output = value

    @property
    def target(self) -> Literal["ALL", "EEVEE", "CYCLES"]:
        return self.node.target

    @target.setter
    def target(self, value: Literal["ALL", "EEVEE", "CYCLES"]):
        self.node.target = value

    @property
    def blend_type(
        self,
    ) -> Literal[
        "MIX",
        "DARKEN",
        "MULTIPLY",
        "BURN",
        "LIGHTEN",
        "SCREEN",
        "DODGE",
        "ADD",
        "OVERLAY",
        "SOFT_LIGHT",
        "LINEAR_LIGHT",
        "DIFFERENCE",
        "EXCLUSION",
        "SUBTRACT",
        "DIVIDE",
        "HUE",
        "SATURATION",
        "COLOR",
        "VALUE",
    ]:
        return self.node.blend_type

    @blend_type.setter
    def blend_type(
        self,
        value: Literal[
            "MIX",
            "DARKEN",
            "MULTIPLY",
            "BURN",
            "LIGHTEN",
            "SCREEN",
            "DODGE",
            "ADD",
            "OVERLAY",
            "SOFT_LIGHT",
            "LINEAR_LIGHT",
            "DIFFERENCE",
            "EXCLUSION",
            "SUBTRACT",
            "DIVIDE",
            "HUE",
            "SATURATION",
            "COLOR",
            "VALUE",
        ],
    ):
        self.node.blend_type = value

    @property
    def use_alpha(self) -> bool:
        return self.node.use_alpha

    @use_alpha.setter
    def use_alpha(self, value: bool):
        self.node.use_alpha = value

    @property
    def use_clamp(self) -> bool:
        return self.node.use_clamp

    @use_clamp.setter
    def use_clamp(self, value: bool):
        self.node.use_clamp = value


class MaterialOutput(BaseNode):
    """
    Output surface material information for use in rendering

    Parameters
    ----------
    surface : InputShader
        Surface
    volume : InputShader
        Volume
    displacement : InputVector
        Displacement
    thickness : InputFloat
        Thickness

    Inputs
    ------
    i.surface : ShaderSocket
        Surface
    i.volume : ShaderSocket
        Volume
    i.displacement : VectorSocket
        Displacement
    i.thickness : FloatSocket
        Thickness
    """

    _bl_idname = "ShaderNodeOutputMaterial"
    node: bpy.types.ShaderNodeOutputMaterial

    class _Inputs(SocketAccessor):
        surface: ShaderSocket
        """Surface"""
        volume: ShaderSocket
        """Volume"""
        displacement: VectorSocket
        """Displacement"""
        thickness: FloatSocket
        """Thickness"""

    class _Outputs(SocketAccessor):
        pass

    if TYPE_CHECKING:

        @property
        def i(self) -> _Inputs: ...
        @property
        def o(self) -> _Outputs: ...

    def __init__(
        self,
        surface: InputShader = None,
        volume: InputShader = None,
        displacement: InputVector = None,
        thickness: InputFloat = 0.0,
        *,
        is_active_output: bool = False,
        target: Literal["ALL", "EEVEE", "CYCLES"] = "ALL",
    ):
        super().__init__()
        key_args = {
            "Surface": surface,
            "Volume": volume,
            "Displacement": displacement,
            "Thickness": thickness,
        }
        self.is_active_output = is_active_output
        self.target = target
        self._establish_links(**key_args)

    @property
    def is_active_output(self) -> bool:
        return self.node.is_active_output

    @is_active_output.setter
    def is_active_output(self, value: bool):
        self.node.is_active_output = value

    @property
    def target(self) -> Literal["ALL", "EEVEE", "CYCLES"]:
        return self.node.target

    @target.setter
    def target(self, value: Literal["ALL", "EEVEE", "CYCLES"]):
        self.node.target = value


class WorldOutput(BaseNode):
    """
    Output light color information to the scene's World

    Parameters
    ----------
    surface : InputShader
        Surface
    volume : InputShader
        Volume

    Inputs
    ------
    i.surface : ShaderSocket
        Surface
    i.volume : ShaderSocket
        Volume
    """

    _bl_idname = "ShaderNodeOutputWorld"
    node: bpy.types.ShaderNodeOutputWorld

    class _Inputs(SocketAccessor):
        surface: ShaderSocket
        """Surface"""
        volume: ShaderSocket
        """Volume"""

    class _Outputs(SocketAccessor):
        pass

    if TYPE_CHECKING:

        @property
        def i(self) -> _Inputs: ...
        @property
        def o(self) -> _Outputs: ...

    def __init__(
        self,
        surface: InputShader = None,
        volume: InputShader = None,
        *,
        is_active_output: bool = False,
        target: Literal["ALL", "EEVEE", "CYCLES"] = "ALL",
    ):
        super().__init__()
        key_args = {"Surface": surface, "Volume": volume}
        self.is_active_output = is_active_output
        self.target = target
        self._establish_links(**key_args)

    @property
    def is_active_output(self) -> bool:
        return self.node.is_active_output

    @is_active_output.setter
    def is_active_output(self, value: bool):
        self.node.is_active_output = value

    @property
    def target(self) -> Literal["ALL", "EEVEE", "CYCLES"]:
        return self.node.target

    @target.setter
    def target(self, value: Literal["ALL", "EEVEE", "CYCLES"]):
        self.node.target = value
