from sqlalchemy import orm
from couchers.context import CouchersContext
"""
@generated by mypy-protobuf.  Do not edit manually!
isort:skip_file
"""

import abc
import collections.abc
import google.protobuf.empty_pb2
import grpc
import grpc.aio
import requests_pb2
import sys
import typing

if sys.version_info >= (3, 13):
    import typing as typing_extensions
else:
    import typing_extensions

_T = typing.TypeVar("_T")

class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ...

class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext):  # type: ignore[misc, type-arg]
    ...

GRPC_GENERATED_VERSION: str
GRPC_VERSION: str
class RequestsServicer(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def CreateHostRequest(
        self,
        request: requests_pb2.CreateHostRequestReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.CreateHostRequestRes, collections.abc.Awaitable[requests_pb2.CreateHostRequestRes]]: ...

    @abc.abstractmethod
    def GetHostRequest(
        self,
        request: requests_pb2.GetHostRequestReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.HostRequest, collections.abc.Awaitable[requests_pb2.HostRequest]]: ...

    @abc.abstractmethod
    def RespondHostRequest(
        self,
        request: requests_pb2.RespondHostRequestReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Change the status of a host request.
        Throws NOT_FOUND if you don't have a host request of that id, NOT_AUTHORIZED
        if you try to change the status to one you aren't allowed.
        """

    @abc.abstractmethod
    def SetHostRequestArchiveStatus(
        self,
        request: requests_pb2.SetHostRequestArchiveStatusReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.SetHostRequestArchiveStatusRes, collections.abc.Awaitable[requests_pb2.SetHostRequestArchiveStatusRes]]:
        """Archive a host request. This will remove it from the list of requests"""

    @abc.abstractmethod
    def ListHostRequests(
        self,
        request: requests_pb2.ListHostRequestsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.ListHostRequestsRes, collections.abc.Awaitable[requests_pb2.ListHostRequestsRes]]: ...

    @abc.abstractmethod
    def GetHostRequestMessages(
        self,
        request: requests_pb2.GetHostRequestMessagesReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.GetHostRequestMessagesRes, collections.abc.Awaitable[requests_pb2.GetHostRequestMessagesRes]]:
        """Get the messages and events (created, accepted, etc) for a host request
        Throws NOT_FOUND if the user isn't part of the request or it doesn't exist
        """

    @abc.abstractmethod
    def SendHostRequestMessage(
        self,
        request: requests_pb2.SendHostRequestMessageReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Adds a new message to a host request
        Throws NOT_FOUND if the user isn't part of the request or it doesn't exist
        Throws PERMISSION_DENIED if you try to send a message to a rejected, confirmed
        or cancelled request
        """

    @abc.abstractmethod
    def GetHostRequestUpdates(
        self,
        request: requests_pb2.GetHostRequestUpdatesReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.GetHostRequestUpdatesRes, collections.abc.Awaitable[requests_pb2.GetHostRequestUpdatesRes]]:
        """Get new messages in a host request and latest status"""

    @abc.abstractmethod
    def MarkLastSeenHostRequest(
        self,
        request: requests_pb2.MarkLastSeenHostRequestReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Saves the last seen message"""

    @abc.abstractmethod
    def GetResponseRate(
        self,
        request: requests_pb2.GetResponseRateReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[requests_pb2.GetResponseRateRes, collections.abc.Awaitable[requests_pb2.GetResponseRateRes]]:
        """Get the response rate and response time for a given user"""

    @abc.abstractmethod
    def SendHostRequestFeedback(
        self,
        request: requests_pb2.SendHostRequestFeedbackReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Send private feedback on host reqeust"""

def add_RequestsServicer_to_server(servicer: RequestsServicer, server: typing.Union[grpc.Server, grpc.aio.Server]) -> None: ...
