import ompl as _ompl
from collections.abc import Sequence
import enum
from typing import overload


class LogLevel(enum.Enum):
    LOG_DEV2 = -2

    LOG_DEV1 = -1

    LOG_DEBUG = 0

    LOG_INFO = 1

    LOG_WARN = 2

    LOG_ERROR = 3

    LOG_NONE = 4

LOG_DEV2: LogLevel = LogLevel.LOG_DEV2

LOG_DEV1: LogLevel = LogLevel.LOG_DEV1

LOG_DEBUG: LogLevel = LogLevel.LOG_DEBUG

LOG_INFO: LogLevel = LogLevel.LOG_INFO

LOG_WARN: LogLevel = LogLevel.LOG_WARN

LOG_ERROR: LogLevel = LogLevel.LOG_ERROR

LOG_NONE: LogLevel = LogLevel.LOG_NONE

class OutputHandler:
    def log(self, text: str, level: LogLevel, filename: str, line: int) -> None: ...

class OutputHandlerSTD(OutputHandler):
    def __init__(self) -> None: ...

    def log(self, text: str, level: LogLevel, filename: str, line: int) -> None: ...

class OutputHandlerFile(OutputHandler):
    def __init__(self, filename: str) -> None: ...

    def log(self, text: str, level: LogLevel, filename: str, line: int) -> None: ...

def setLogLevel(level: LogLevel) -> None: ...

def getLogLevel() -> LogLevel: ...

def noOutputHandler() -> None: ...

def restorePreviousOutputHandler() -> None: ...

def useOutputHandler(oh: OutputHandler) -> None: ...

def getOutputHandler() -> OutputHandler: ...

def OMPL_ERROR(message: str) -> None: ...

def OMPL_WARN(message: str) -> None: ...

def OMPL_INFORM(message: str) -> None: ...

def OMPL_DEBUG(message: str) -> None: ...

def OMPL_DEVMSG1(message: str) -> None: ...

def OMPL_DEVMSG2(message: str) -> None: ...

class Color:
    def __init__(self) -> None: ...

    @property
    def red(self) -> int: ...

    @red.setter
    def red(self, arg: int, /) -> None: ...

    @property
    def green(self) -> int: ...

    @green.setter
    def green(self, arg: int, /) -> None: ...

    @property
    def blue(self) -> int: ...

    @blue.setter
    def blue(self, arg: int, /) -> None: ...

class PPM:
    def __init__(self) -> None: ...

    def loadFile(self, arg: str, /) -> None: ...

    def saveFile(self, arg: str, /) -> None: ...

    def getWidth(self) -> int: ...

    def getHeight(self) -> int: ...

    def setWidth(self, arg: int, /) -> None: ...

    def setHeight(self, arg: int, /) -> None: ...

    def getPixel(self, row: int, col: int) -> Color: ...

class RNG:
    @overload
    def __init__(self) -> None: ...

    @overload
    def __init__(self, localSeed: int) -> None: ...

    def uniform01(self) -> float: ...

    def uniformReal(self, lower_bound: float, upper_bound: float) -> float: ...

    def uniformInt(self, lower_bound: int, upper_bound: int) -> int: ...

    def uniformBool(self) -> bool: ...

    def gaussian01(self) -> float: ...

    def gaussian(self, mean: float, stddev: float) -> float: ...

    def halfNormalReal(self, r_min: float, r_max: float, focus: float = 3.0) -> float: ...

    def halfNormalInt(self, r_min: int, r_max: int, focus: float = 3.0) -> int: ...

    def quaternion(self) -> list[float]: ...

    def eulerRPY(self) -> list[float]: ...

    def uniformNormalVector(self, v: Sequence[float]) -> None: ...

    def uniformInBall(self, r: float, v: Sequence[float]) -> None: ...

    def setLocalSeed(self, localSeed: int) -> None: ...

    def getLocalSeed(self) -> int: ...

    @staticmethod
    def getSeed() -> int: ...

    @staticmethod
    def setSeed(seed: int) -> None: ...
