from collections.abc import Iterator, Sequence
from typing import Any, Final

from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.models.expressions import Expression
from django.db.models.fields import BooleanField
from django.db.models.lookups import Lookup
from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT
from django.utils import tree
from django.utils.functional import cached_property

AND: Final = "AND"
OR: Final = "OR"
XOR: Final = "XOR"

class WhereNode(tree.Node):
    resolved: bool
    conditional: bool
    def split_having_qualify(
        self, negated: bool = ..., must_group_by: bool = ...
    ) -> tuple[WhereNode | None, WhereNode | None, WhereNode | None]: ...
    def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ...
    def get_group_by_cols(self) -> list[Expression]: ...
    def get_source_expressions(self) -> list[Any]: ...
    def set_source_expressions(self, children: list[Any]) -> None: ...
    def relabel_aliases(self, change_map: dict[str | None, str]) -> None: ...
    def clone(self) -> WhereNode: ...
    def relabeled_clone(self, change_map: dict[str | None, str]) -> WhereNode: ...
    def replace_expressions(self, replacements: dict[Any, Any]) -> WhereNode: ...
    def get_refs(self) -> set[str]: ...
    @cached_property
    def contains_aggregate(self) -> bool: ...
    @cached_property
    def contains_over_clause(self) -> bool: ...
    @property
    def is_summary(self) -> bool: ...
    def resolve_expression(self, *args: Any, **kwargs: Any) -> WhereNode: ...
    @cached_property
    def output_field(self) -> BooleanField[bool]: ...
    def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ...
    def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Any]: ...
    def get_lookup(self, lookup: str) -> type[Lookup[Any]] | None: ...
    def leaves(self) -> Iterator[Any]: ...

class NothingNode:
    contains_aggregate: bool
    contains_over_clause: bool
    def as_sql(
        self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None
    ) -> _AsSqlType: ...

class ExtraWhere:
    contains_aggregate: bool
    contains_over_clause: bool
    sqls: Sequence[str]
    params: Sequence[int] | Sequence[str] | None
    def __init__(self, sqls: Sequence[str], params: Sequence[int] | Sequence[str] | None) -> None: ...
    def as_sql(
        self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None
    ) -> _AsSqlType: ...
