from datetime import date, datetime, time, timedelta
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
from uuid import UUID

from django.core.management.color import Style
from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.sqlite3.base import (DatabaseWrapper,
                                             SQLiteCursorWrapper)
from django.db.backends.utils import CursorDebugWrapper
from django.db.models.base import Model
from django.db.models.expressions import (BaseExpression, Col, Expression, F,
                                          SQLiteNumericMixin)
from django.db.models.fields import Field
from django.utils.datastructures import ImmutableList


class DatabaseOperations(BaseDatabaseOperations):
    connection: django.db.backends.sqlite3.base.DatabaseWrapper
    cast_char_field_without_max_length: str = ...
    cast_data_types: Any = ...
    explain_prefix: str = ...
    def bulk_batch_size(
        self,
        fields: Union[List[Field], List[str], ImmutableList],
        objs: Union[List[Model], range],
    ) -> int: ...
    def check_expression_support(
        self, expression: Union[BaseExpression, SQLiteNumericMixin]
    ) -> None: ...
    def date_extract_sql(self, lookup_type: str, field_name: str) -> str: ...
    def date_interval_sql(self, timedelta: timedelta) -> str: ...
    def format_for_duration_arithmetic(self, sql: str) -> str: ...
    def date_trunc_sql(self, lookup_type: str, field_name: str) -> str: ...
    def time_trunc_sql(self, lookup_type: str, field_name: str) -> str: ...
    def datetime_cast_date_sql(
        self, field_name: str, tzname: Optional[str]
    ) -> str: ...
    def datetime_cast_time_sql(
        self, field_name: str, tzname: Optional[str]
    ) -> str: ...
    def datetime_extract_sql(
        self, lookup_type: str, field_name: str, tzname: Optional[str]
    ) -> str: ...
    def datetime_trunc_sql(
        self, lookup_type: str, field_name: str, tzname: Optional[str]
    ) -> str: ...
    def time_extract_sql(self, lookup_type: str, field_name: str) -> str: ...
    def pk_default_value(self) -> str: ...
    def last_executed_query(
        self,
        cursor: Union[SQLiteCursorWrapper, CursorDebugWrapper],
        sql: str,
        params: Optional[Union[List[int], List[str], Tuple]],
    ) -> str: ...
    def quote_name(self, name: str) -> str: ...
    def no_limit_value(self) -> int: ...
    def sql_flush(
        self,
        style: Style,
        tables: List[str],
        sequences: Union[List[Dict[str, str]], Tuple],
        allow_cascade: bool = ...,
    ) -> List[str]: ...
    def execute_sql_flush(self, using: str, sql_list: List[str]) -> None: ...
    def adapt_datetimefield_value(
        self, value: Optional[Union[datetime, F]]
    ) -> Optional[Union[F, str]]: ...
    def adapt_timefield_value(
        self, value: Optional[Union[time, F]]
    ) -> Optional[Union[F, str]]: ...
    def get_db_converters(self, expression: Expression) -> List[Callable]: ...
    def convert_datetimefield_value(
        self,
        value: Optional[Union[datetime, str]],
        expression: Expression,
        connection: DatabaseWrapper,
    ) -> Optional[datetime]: ...
    def convert_datefield_value(
        self,
        value: Optional[Union[date, str]],
        expression: Expression,
        connection: DatabaseWrapper,
    ) -> Optional[date]: ...
    def convert_timefield_value(
        self,
        value: Optional[Union[time, str]],
        expression: Expression,
        connection: DatabaseWrapper,
    ) -> Optional[time]: ...
    def get_decimalfield_converter(
        self, expression: Expression
    ) -> Callable: ...
    def convert_uuidfield_value(
        self, value: Optional[str], expression: Col, connection: DatabaseWrapper
    ) -> Optional[UUID]: ...
    def convert_booleanfield_value(
        self,
        value: Optional[int],
        expression: Expression,
        connection: DatabaseWrapper,
    ) -> Optional[bool]: ...
    def bulk_insert_sql(
        self,
        fields: Union[List[None], List[Field], ImmutableList],
        placeholder_rows: Union[List[Any], Tuple[Tuple[str]]],
    ) -> str: ...
    def combine_expression(
        self, connector: str, sub_expressions: List[str]
    ) -> str: ...
    def combine_duration_expression(
        self, connector: str, sub_expressions: List[str]
    ) -> str: ...
    def integer_field_range(self, internal_type: str) -> Tuple[None, None]: ...
    def subtract_temporals(
        self,
        internal_type: str,
        lhs: Tuple[str, List[Any]],
        rhs: Tuple[str, List[str]],
    ) -> Tuple[str, List[str]]: ...
