from typing import Any, Dict, Optional, Set, Tuple, Union, Sequence

from django.db import DefaultConnectionProxy
from django.db.backends.base.base import BaseDatabaseWrapper
from django.db.backends.sqlite3.base import DatabaseWrapper
from django.db.migrations.migration import Migration, SwappableTuple
from django.db.migrations.state import ProjectState

MIGRATIONS_MODULE_NAME: str

class MigrationLoader:
    connection: Any = ...
    disk_migrations: Dict[Tuple[str, str], Migration] = ...
    applied_migrations: None = ...
    ignore_no_migrations: bool = ...
    def __init__(
        self,
        connection: Optional[Union[DefaultConnectionProxy, BaseDatabaseWrapper]],
        load: bool = ...,
        ignore_no_migrations: bool = ...,
    ) -> None: ...
    @classmethod
    def migrations_module(cls, app_label: str) -> Tuple[Optional[str], bool]: ...
    unmigrated_apps: Set[str] = ...
    migrated_apps: Set[str] = ...
    def load_disk(self) -> None: ...
    def get_migration(self, app_label: str, name_prefix: str) -> Migration: ...
    def get_migration_by_prefix(self, app_label: str, name_prefix: str) -> Migration: ...
    def check_key(self, key: Union[Tuple[str, str], SwappableTuple], current_app: str) -> Optional[Tuple[str, str]]: ...
    def add_internal_dependencies(self, key: Tuple[str, str], migration: Migration) -> None: ...
    def add_external_dependencies(self, key: Tuple[str, str], migration: Migration) -> None: ...
    graph: Any = ...
    replacements: Any = ...
    def build_graph(self) -> None: ...
    def check_consistent_history(self, connection: Any) -> None: ...
    def detect_conflicts(self) -> Dict[str, Set[str]]: ...
    def project_state(
        self, nodes: Optional[Tuple[str, str], Sequence[Tuple[str, str]]] = ..., at_end: bool = ...
    ) -> ProjectState: ...
