from _typeshed import FileDescriptorOrPath, ReadableBuffer, WriteableBuffer
from collections.abc import Iterable
from io import FileIO
from typing import type_check_only

from ..base import AsyncBase, AsyncIndirectBase

# This class does not exist at runtime and instead these methods are
# all dynamically patched in.
@type_check_only
class _UnknownAsyncBinaryIO(AsyncBase[bytes]):
    async def close(self) -> None: ...
    async def flush(self) -> None: ...
    async def isatty(self) -> bool: ...
    async def read(self, size: int = ..., /) -> bytes: ...
    async def readinto(self, buffer: WriteableBuffer, /) -> int | None: ...
    async def readline(self, size: int | None = ..., /) -> bytes: ...
    async def readlines(self, hint: int = ..., /) -> list[bytes]: ...
    async def seek(self, offset: int, whence: int = ..., /) -> int: ...
    async def seekable(self) -> bool: ...
    async def tell(self) -> int: ...
    async def truncate(self, size: int | None = ..., /) -> int: ...
    async def writable(self) -> bool: ...
    async def write(self, b: ReadableBuffer, /) -> int: ...
    async def writelines(self, lines: Iterable[ReadableBuffer], /) -> None: ...
    def fileno(self) -> int: ...
    def readable(self) -> bool: ...
    @property
    def closed(self) -> bool: ...
    @property
    def mode(self) -> str: ...
    @property
    def name(self) -> FileDescriptorOrPath: ...

class AsyncBufferedIOBase(_UnknownAsyncBinaryIO):
    async def read1(self, size: int = ..., /) -> bytes: ...
    def detach(self) -> FileIO: ...
    @property
    def raw(self) -> FileIO: ...

class AsyncIndirectBufferedIOBase(AsyncIndirectBase[bytes], _UnknownAsyncBinaryIO):
    async def read1(self, size: int = ..., /) -> bytes: ...
    def detach(self) -> FileIO: ...
    @property
    def raw(self) -> FileIO: ...

class AsyncBufferedReader(AsyncBufferedIOBase):
    async def peek(self, size: int = ..., /) -> bytes: ...

class AsyncIndirectBufferedReader(AsyncIndirectBufferedIOBase):
    async def peek(self, size: int = ..., /) -> bytes: ...

class AsyncFileIO(_UnknownAsyncBinaryIO):
    async def readall(self) -> bytes: ...

class AsyncIndirectFileIO(AsyncIndirectBase[bytes], _UnknownAsyncBinaryIO):
    async def readall(self) -> bytes: ...
