from typing import TYPE_CHECKING, Any, overload

if TYPE_CHECKING:
    from ._typing import IntoExpr, IntoPyType

class Expression:
    def __add__(self, other: IntoExpr) -> Expression: ...
    def __and__(self, other: IntoExpr) -> Expression: ...
    def __div__(self, other: IntoExpr) -> Expression: ...
    def __eq__(self, other: IntoExpr) -> Expression: ...  # type: ignore[override]
    def __floordiv__(self, other: IntoExpr) -> Expression: ...
    def __ge__(self, other: IntoExpr) -> Expression: ...
    def __gt__(self, other: IntoExpr) -> Expression: ...
    @overload
    def __init__(self, arg0: str) -> None: ...
    @overload
    def __init__(self, arg0: Any) -> None: ...
    def __invert__(self) -> Expression: ...
    def __le__(self, other: IntoExpr) -> Expression: ...
    def __lt__(self, other: IntoExpr) -> Expression: ...
    def __mod__(self, other: IntoExpr) -> Expression: ...
    def __mul__(self, other: IntoExpr) -> Expression: ...
    def __ne__(self, other: IntoExpr) -> Expression: ...  # type: ignore[override]
    def __neg__(self) -> Expression: ...
    def __or__(self, other: IntoExpr) -> Expression: ...
    def __pow__(self, other: IntoExpr) -> Expression: ...
    def __radd__(self, other: IntoExpr) -> Expression: ...
    def __rand__(self, other: IntoExpr) -> Expression: ...
    def __rdiv__(self, other: IntoExpr) -> Expression: ...
    def __rfloordiv__(self, other: IntoExpr) -> Expression: ...
    def __rmod__(self, other: IntoExpr) -> Expression: ...
    def __rmul__(self, other: IntoExpr) -> Expression: ...
    def __ror__(self, other: IntoExpr) -> Expression: ...
    def __rpow__(self, other: IntoExpr) -> Expression: ...
    def __rsub__(self, other: IntoExpr) -> Expression: ...
    def __rtruediv__(self, other: IntoExpr) -> Expression: ...
    def __sub__(self, other: IntoExpr) -> Expression: ...
    def __truediv__(self, other: IntoExpr) -> Expression: ...
    def alias(self, name: str) -> Expression: ...
    def asc(self) -> Expression: ...
    def between(self, lower: IntoExpr, upper: IntoExpr) -> Expression: ...
    def cast(self, type: IntoPyType) -> Expression: ...
    def collate(self, collation: str) -> Expression: ...
    def desc(self) -> Expression: ...
    def get_name(self) -> str: ...
    def isin(self, *args: IntoExpr) -> Expression: ...
    def isnotin(self, *args: IntoExpr) -> Expression: ...
    def isnotnull(self) -> Expression: ...
    def isnull(self) -> Expression: ...
    def nulls_first(self) -> Expression: ...
    def nulls_last(self) -> Expression: ...
    def otherwise(self, value: IntoExpr) -> Expression: ...
    def show(self) -> None: ...
    def when(self, condition: IntoExpr, value: IntoExpr) -> Expression: ...
