from typing import Any, Optional, Set

from django.contrib.auth.base_user import AbstractBaseUser
from django.core.handlers.wsgi import WSGIRequest
from django.http.request import HttpRequest
from django.http.response import HttpResponseRedirect
from django.template.response import TemplateResponse
from django.views.generic.base import TemplateView
from django.views.generic.edit import FormView

UserModel: Any

class SuccessURLAllowedHostsMixin:
    success_url_allowed_hosts: Any = ...
    def get_success_url_allowed_hosts(self) -> Set[str]: ...

class LoginView(SuccessURLAllowedHostsMixin, FormView):
    authentication_form: Any = ...
    redirect_field_name: Any = ...
    redirect_authenticated_user: bool = ...
    extra_context: Any = ...
    def get_redirect_url(self) -> str: ...

class LogoutView(SuccessURLAllowedHostsMixin, TemplateView):
    next_page: Any = ...
    redirect_field_name: Any = ...
    extra_context: Any = ...
    def post(self, request: WSGIRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ...
    def get_next_page(self) -> Optional[str]: ...

def logout_then_login(request: HttpRequest, login_url: Optional[str] = ...) -> HttpResponseRedirect: ...
def redirect_to_login(
    next: str, login_url: Optional[str] = ..., redirect_field_name: Optional[str] = ...
) -> HttpResponseRedirect: ...

class PasswordContextMixin:
    extra_context: Any = ...
    def get_context_data(self, **kwargs: Any): ...

class PasswordResetView(PasswordContextMixin, FormView):
    email_template_name: str = ...
    extra_email_context: Any = ...
    from_email: Any = ...
    html_email_template_name: Any = ...
    subject_template_name: str = ...
    title: Any = ...
    token_generator: Any = ...

INTERNAL_RESET_URL_TOKEN: str
INTERNAL_RESET_SESSION_TOKEN: str

class PasswordResetDoneView(PasswordContextMixin, TemplateView):
    title: Any = ...

class PasswordResetConfirmView(PasswordContextMixin, FormView):
    post_reset_login: bool = ...
    post_reset_login_backend: Any = ...
    title: Any = ...
    token_generator: Any = ...
    validlink: bool = ...
    user: Any = ...
    def get_user(self, uidb64: str) -> Optional[AbstractBaseUser]: ...

class PasswordResetCompleteView(PasswordContextMixin, TemplateView):
    title: Any = ...

class PasswordChangeView(PasswordContextMixin, FormView):
    title: Any = ...

class PasswordChangeDoneView(PasswordContextMixin, TemplateView):
    title: Any = ...
