import collections
from collections import namedtuple
from typing import Type, TypeAlias, TypeVar, NewType, NamedTuple, TypedDict

GLOBAL: str = "foo"


def assign():
    global GLOBAL
    GLOBAL = "bar"
    lower = 0
    Camel = 0
    CONSTANT = 0
    _ = 0

    MyObj1 = collections.namedtuple("MyObj1", ["a", "b"])
    MyObj2 = namedtuple("MyObj12", ["a", "b"])

    T = TypeVar("T")
    UserId = NewType("UserId", int)

    Employee = NamedTuple("Employee", [("name", str), ("id", int)])

    Point2D = TypedDict("Point2D", {"in": int, "x-y": int})

    IntOrStr: TypeAlias = int | str

    type MyInt = int


def aug_assign(rank, world_size):
    global CURRENT_PORT

    CURRENT_PORT += 1
    if CURRENT_PORT > MAX_PORT:
        CURRENT_PORT = START_PORT


def loop_assign():
    global CURRENT_PORT
    for CURRENT_PORT in range(5):
        pass


def model_assign() -> None:
    Bad = apps.get_model("zerver", "Stream")  # N806
    Attachment = apps.get_model("zerver", "Attachment")  # OK
    Recipient = apps.get_model("zerver", model_name="Recipient")  # OK
    Address: Type = apps.get_model("zerver", "Address")  # OK

    from django.utils.module_loading import import_string

    Bad = import_string("django.core.exceptions.ValidationError")  # N806
    ValidationError = import_string("django.core.exceptions.ValidationError")  # OK

    Bad = apps.get_model()  # N806
    Bad = apps.get_model(model_name="Stream")  # N806

    Address: Type = apps.get_model("zerver", variable)  # OK
    ValidationError = import_string(variable)  # N806


def match_case_names(x):
    match x:
        case BadName:  # N806
            ...
        case int(GoodName):  # N806 (capture in class pattern)
            ...
        case [*Rest]:  # N806 (star pattern)
            ...
        case {"key": Val} as Alias:  # N806 (mapping value + as pattern)
            ...
        case ok_name:  # OK
            ...
        case _:  # OK
            ...
