import sys
from _typeshed import FileDescriptorLike
from typing import Any, Final
from typing_extensions import TypeAlias

# Must be a list of length 7, containing 6 ints and a list of NCCS 1-character bytes or ints.
_Attr: TypeAlias = list[int | list[bytes | int]] | list[int | list[bytes]] | list[int | list[int]]
# Same as _Attr for return types; we use Any to avoid a union.
_AttrReturn: TypeAlias = list[Any]

if sys.platform != "win32":
    # Values depends on the platform
    B0: Final[int]
    B110: Final[int]
    B115200: Final[int]
    B1200: Final[int]
    B134: Final[int]
    B150: Final[int]
    B1800: Final[int]
    B19200: Final[int]
    B200: Final[int]
    B230400: Final[int]
    B2400: Final[int]
    B300: Final[int]
    B38400: Final[int]
    B4800: Final[int]
    B50: Final[int]
    B57600: Final[int]
    B600: Final[int]
    B75: Final[int]
    B9600: Final[int]
    BRKINT: Final[int]
    BS0: Final[int]
    BS1: Final[int]
    BSDLY: Final[int]
    CDSUSP: Final[int]
    CEOF: Final[int]
    CEOL: Final[int]
    CEOT: Final[int]
    CERASE: Final[int]
    CFLUSH: Final[int]
    CINTR: Final[int]
    CKILL: Final[int]
    CLNEXT: Final[int]
    CLOCAL: Final[int]
    CQUIT: Final[int]
    CR0: Final[int]
    CR1: Final[int]
    CR2: Final[int]
    CR3: Final[int]
    CRDLY: Final[int]
    CREAD: Final[int]
    CRPRNT: Final[int]
    CRTSCTS: Final[int]
    CS5: Final[int]
    CS6: Final[int]
    CS7: Final[int]
    CS8: Final[int]
    CSIZE: Final[int]
    CSTART: Final[int]
    CSTOP: Final[int]
    CSTOPB: Final[int]
    CSUSP: Final[int]
    CWERASE: Final[int]
    ECHO: Final[int]
    ECHOCTL: Final[int]
    ECHOE: Final[int]
    ECHOK: Final[int]
    ECHOKE: Final[int]
    ECHONL: Final[int]
    ECHOPRT: Final[int]
    EXTA: Final[int]
    EXTB: Final[int]
    FF0: Final[int]
    FF1: Final[int]
    FFDLY: Final[int]
    FIOASYNC: Final[int]
    FIOCLEX: Final[int]
    FIONBIO: Final[int]
    FIONCLEX: Final[int]
    FIONREAD: Final[int]
    FLUSHO: Final[int]
    HUPCL: Final[int]
    ICANON: Final[int]
    ICRNL: Final[int]
    IEXTEN: Final[int]
    IGNBRK: Final[int]
    IGNCR: Final[int]
    IGNPAR: Final[int]
    IMAXBEL: Final[int]
    INLCR: Final[int]
    INPCK: Final[int]
    ISIG: Final[int]
    ISTRIP: Final[int]
    IXANY: Final[int]
    IXOFF: Final[int]
    IXON: Final[int]
    NCCS: Final[int]
    NL0: Final[int]
    NL1: Final[int]
    NLDLY: Final[int]
    NOFLSH: Final[int]
    OCRNL: Final[int]
    OFDEL: Final[int]
    OFILL: Final[int]
    ONLCR: Final[int]
    ONLRET: Final[int]
    ONOCR: Final[int]
    OPOST: Final[int]
    PARENB: Final[int]
    PARMRK: Final[int]
    PARODD: Final[int]
    PENDIN: Final[int]
    TAB0: Final[int]
    TAB1: Final[int]
    TAB2: Final[int]
    TAB3: Final[int]
    TABDLY: Final[int]
    TCIFLUSH: Final[int]
    TCIOFF: Final[int]
    TCIOFLUSH: Final[int]
    TCION: Final[int]
    TCOFLUSH: Final[int]
    TCOOFF: Final[int]
    TCOON: Final[int]
    TCSADRAIN: Final[int]
    TCSAFLUSH: Final[int]
    TCSANOW: Final[int]
    TIOCCONS: Final[int]
    TIOCEXCL: Final[int]
    TIOCGETD: Final[int]
    TIOCGPGRP: Final[int]
    TIOCGWINSZ: Final[int]
    TIOCM_CAR: Final[int]
    TIOCM_CD: Final[int]
    TIOCM_CTS: Final[int]
    TIOCM_DSR: Final[int]
    TIOCM_DTR: Final[int]
    TIOCM_LE: Final[int]
    TIOCM_RI: Final[int]
    TIOCM_RNG: Final[int]
    TIOCM_RTS: Final[int]
    TIOCM_SR: Final[int]
    TIOCM_ST: Final[int]
    TIOCMBIC: Final[int]
    TIOCMBIS: Final[int]
    TIOCMGET: Final[int]
    TIOCMSET: Final[int]
    TIOCNOTTY: Final[int]
    TIOCNXCL: Final[int]
    TIOCOUTQ: Final[int]
    TIOCPKT_DATA: Final[int]
    TIOCPKT_DOSTOP: Final[int]
    TIOCPKT_FLUSHREAD: Final[int]
    TIOCPKT_FLUSHWRITE: Final[int]
    TIOCPKT_NOSTOP: Final[int]
    TIOCPKT_START: Final[int]
    TIOCPKT_STOP: Final[int]
    TIOCPKT: Final[int]
    TIOCSCTTY: Final[int]
    TIOCSETD: Final[int]
    TIOCSPGRP: Final[int]
    TIOCSTI: Final[int]
    TIOCSWINSZ: Final[int]
    TOSTOP: Final[int]
    VDISCARD: Final[int]
    VEOF: Final[int]
    VEOL: Final[int]
    VEOL2: Final[int]
    VERASE: Final[int]
    VINTR: Final[int]
    VKILL: Final[int]
    VLNEXT: Final[int]
    VMIN: Final[int]
    VQUIT: Final[int]
    VREPRINT: Final[int]
    VSTART: Final[int]
    VSTOP: Final[int]
    VSUSP: Final[int]
    VT0: Final[int]
    VT1: Final[int]
    VTDLY: Final[int]
    VTIME: Final[int]
    VWERASE: Final[int]

    if sys.version_info >= (3, 13):
        EXTPROC: Final[int]
        IUTF8: Final[int]

    if sys.platform == "darwin" and sys.version_info >= (3, 13):
        ALTWERASE: Final[int]
        B14400: Final[int]
        B28800: Final[int]
        B7200: Final[int]
        B76800: Final[int]
        CCAR_OFLOW: Final[int]
        CCTS_OFLOW: Final[int]
        CDSR_OFLOW: Final[int]
        CDTR_IFLOW: Final[int]
        CIGNORE: Final[int]
        CRTS_IFLOW: Final[int]
        MDMBUF: Final[int]
        NL2: Final[int]
        NL3: Final[int]
        NOKERNINFO: Final[int]
        ONOEOT: Final[int]
        OXTABS: Final[int]
        VDSUSP: Final[int]
        VSTATUS: Final[int]

    if sys.platform == "darwin" and sys.version_info >= (3, 11):
        TIOCGSIZE: Final[int]
        TIOCSSIZE: Final[int]

    if sys.platform == "linux":
        B1152000: Final[int]
        B576000: Final[int]
        CBAUD: Final[int]
        CBAUDEX: Final[int]
        CIBAUD: Final[int]
        IOCSIZE_MASK: Final[int]
        IOCSIZE_SHIFT: Final[int]
        IUCLC: Final[int]
        N_MOUSE: Final[int]
        N_PPP: Final[int]
        N_SLIP: Final[int]
        N_STRIP: Final[int]
        N_TTY: Final[int]
        NCC: Final[int]
        OLCUC: Final[int]
        TCFLSH: Final[int]
        TCGETA: Final[int]
        TCGETS: Final[int]
        TCSBRK: Final[int]
        TCSBRKP: Final[int]
        TCSETA: Final[int]
        TCSETAF: Final[int]
        TCSETAW: Final[int]
        TCSETS: Final[int]
        TCSETSF: Final[int]
        TCSETSW: Final[int]
        TCXONC: Final[int]
        TIOCGICOUNT: Final[int]
        TIOCGLCKTRMIOS: Final[int]
        TIOCGSERIAL: Final[int]
        TIOCGSOFTCAR: Final[int]
        TIOCINQ: Final[int]
        TIOCLINUX: Final[int]
        TIOCMIWAIT: Final[int]
        TIOCTTYGSTRUCT: Final[int]
        TIOCSER_TEMT: Final[int]
        TIOCSERCONFIG: Final[int]
        TIOCSERGETLSR: Final[int]
        TIOCSERGETMULTI: Final[int]
        TIOCSERGSTRUCT: Final[int]
        TIOCSERGWILD: Final[int]
        TIOCSERSETMULTI: Final[int]
        TIOCSERSWILD: Final[int]
        TIOCSLCKTRMIOS: Final[int]
        TIOCSSERIAL: Final[int]
        TIOCSSOFTCAR: Final[int]
        VSWTC: Final[int]
        VSWTCH: Final[int]
        XCASE: Final[int]
        XTABS: Final[int]

    if sys.platform != "darwin":
        B1000000: Final[int]
        B1500000: Final[int]
        B2000000: Final[int]
        B2500000: Final[int]
        B3000000: Final[int]
        B3500000: Final[int]
        B4000000: Final[int]
        B460800: Final[int]
        B500000: Final[int]
        B921600: Final[int]

    if sys.platform != "linux":
        TCSASOFT: Final[int]

    if sys.platform != "darwin" and sys.platform != "linux":
        # not available on FreeBSD either.
        CDEL: Final[int]
        CEOL2: Final[int]
        CESC: Final[int]
        CNUL: Final[int]
        COMMON: Final[int]
        CSWTCH: Final[int]
        IBSHIFT: Final[int]
        INIT_C_CC: Final[int]
        NSWTCH: Final[int]

    def tcgetattr(fd: FileDescriptorLike, /) -> _AttrReturn: ...
    def tcsetattr(fd: FileDescriptorLike, when: int, attributes: _Attr, /) -> None: ...
    def tcsendbreak(fd: FileDescriptorLike, duration: int, /) -> None: ...
    def tcdrain(fd: FileDescriptorLike, /) -> None: ...
    def tcflush(fd: FileDescriptorLike, queue: int, /) -> None: ...
    def tcflow(fd: FileDescriptorLike, action: int, /) -> None: ...
    if sys.version_info >= (3, 11):
        def tcgetwinsize(fd: FileDescriptorLike, /) -> tuple[int, int]: ...
        def tcsetwinsize(fd: FileDescriptorLike, winsize: tuple[int, int], /) -> None: ...

    class error(Exception): ...
