from collections.abc import Container
from typing import Any, Sequence, Tuple, Union, overload
from typing_extensions import Literal

from .Image import Image
from .ImageColor import _Ink
from .ImageFont import _Font

_XY = Sequence[Union[float, Tuple[float, float]]]
_Outline = Any

class ImageDraw:
    def __init__(self, im: Image, mode: str | None = ...) -> None: ...
    def getfont(self): ...
    def arc(self, xy: _XY, start: float, end: float, fill: _Ink | None = ..., width: float = ...) -> None: ...
    def bitmap(self, xy: _XY, bitmap: Image, fill: _Ink | None = ...) -> None: ...
    def chord(
        self, xy: _XY, start: float, end: float, fill: _Ink | None = ..., outline: _Ink | None = ..., width: float = ...
    ) -> None: ...
    def ellipse(self, xy: _XY, fill: _Ink | None = ..., outline: _Ink | None = ..., width: float = ...) -> None: ...
    def line(self, xy: _XY, fill: _Ink | None = ..., width: float = ..., joint: Literal["curve"] | None = ...) -> None: ...
    def shape(self, shape: _Outline, fill: _Ink | None = ..., outline: _Ink | None = ...) -> None: ...
    def pieslice(
        self,
        xy: tuple[tuple[float, float], tuple[float, float]],
        start: float,
        end: float,
        fill: _Ink | None = ...,
        outline: _Ink | None = ...,
        width: float = ...,
    ) -> None: ...
    def point(self, xy: _XY, fill: _Ink | None = ...) -> None: ...
    def polygon(self, xy: _XY, fill: _Ink | None = ..., outline: _Ink | None = ...) -> None: ...
    def regular_polygon(
        self,
        bounding_circle: tuple[float, float] | tuple[float, float, float] | list[int],
        n_sides: int,
        rotation: float = ...,
        fill: _Ink | None = ...,
        outline: _Ink | None = ...,
    ) -> None: ...
    def rectangle(
        self,
        xy: tuple[float, float, float, float] | tuple[tuple[float, float], tuple[float, float]],
        fill: _Ink | None = ...,
        outline: _Ink | None = ...,
        width: float = ...,
    ) -> None: ...
    def rounded_rectangle(
        self,
        xy: tuple[float, float, float, float] | tuple[tuple[float, float], tuple[float, float]],
        radius: float = ...,
        fill: _Ink | None = ...,
        outline: _Ink | None = ...,
        width: float = ...,
    ) -> None: ...
    def text(
        self,
        xy: tuple[float, float],
        text: str | bytes,
        fill: _Ink | None = ...,
        font: _Font | None = ...,
        anchor: str | None = ...,
        spacing: float = ...,
        align: Literal["left", "center", "right"] = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Sequence[str] | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
        stroke_fill: _Ink | None = ...,
        embedded_color: bool = ...,
        *args,
        **kwargs,
    ) -> None: ...
    def multiline_text(
        self,
        xy: tuple[float, float],
        text: str | bytes,
        fill: _Ink | None = ...,
        font: _Font | None = ...,
        anchor: str | None = ...,
        spacing: float = ...,
        align: Literal["left", "center", "right"] = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Any | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
        stroke_fill: _Ink | None = ...,
        embedded_color: bool = ...,
    ) -> None: ...
    def textsize(
        self,
        text: str | bytes,
        font: _Font | None = ...,
        spacing: float = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Sequence[str] | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
    ) -> tuple[int, int]: ...
    def multiline_textsize(
        self,
        text: str | bytes,
        font: _Font | None = ...,
        spacing: float = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Sequence[str] | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
    ) -> tuple[int, int]: ...
    def textlength(
        self,
        text: str | bytes,
        font: _Font | None = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Sequence[str] | None = ...,
        language: str | None = ...,
        embedded_color: bool = ...,
    ) -> int: ...
    def textbbox(
        self,
        xy: tuple[float, float],
        text: str | bytes,
        font: _Font | None = ...,
        anchor: str | None = ...,
        spacing: float = ...,
        align: Literal["left", "center", "right"] = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Any | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
        embedded_color: bool = ...,
    ) -> tuple[int, int, int, int]: ...
    def multiline_textbbox(
        self,
        xy: tuple[float, float],
        text: str | bytes,
        font: _Font | None = ...,
        anchor: str | None = ...,
        spacing: float = ...,
        align: Literal["left", "center", "right"] = ...,
        direction: Literal["rtl", "ltr", "ttb"] | None = ...,
        features: Any | None = ...,
        language: str | None = ...,
        stroke_width: int = ...,
        embedded_color: bool = ...,
    ) -> tuple[int, int, int, int]: ...

def Draw(im: Image, mode: str | None = ...) -> ImageDraw: ...
def Outline() -> _Outline: ...
@overload
def getdraw(im: None = ..., hints: Container[Literal["nicest"]] | None = ...) -> tuple[None, Any]: ...
@overload
def getdraw(im: Image, hints: Container[Literal["nicest"]] | None = ...) -> tuple[Image, Any]: ...
def floodfill(image: Image, xy: tuple[float, float], value, border=..., thresh: float = ...) -> None: ...
