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

import abc
import admin_pb2
import api_pb2
import collections.abc
import google.protobuf.empty_pb2
import grpc
import grpc.aio
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 AdminServicer(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def GetUserDetails(
        self,
        request: admin_pb2.GetUserDetailsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def GetUser(
        self,
        request: admin_pb2.GetUserReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[api_pb2.User, collections.abc.Awaitable[api_pb2.User]]:
        """Get info about a particular user, ignores the fact that they may be banned/deleted"""

    @abc.abstractmethod
    def SearchUsers(
        self,
        request: admin_pb2.SearchUsersReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.SearchUsersRes, collections.abc.Awaitable[admin_pb2.SearchUsersRes]]: ...

    @abc.abstractmethod
    def ChangeUserGender(
        self,
        request: admin_pb2.ChangeUserGenderReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def ChangeUserBirthdate(
        self,
        request: admin_pb2.ChangeUserBirthdateReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def AddBadge(
        self,
        request: admin_pb2.AddBadgeReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def RemoveBadge(
        self,
        request: admin_pb2.RemoveBadgeReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def SetPassportSexGenderException(
        self,
        request: admin_pb2.SetPassportSexGenderExceptionReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def BanUser(
        self,
        request: admin_pb2.BanUserReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def UnbanUser(
        self,
        request: admin_pb2.UnbanUserReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def AddAdminNote(
        self,
        request: admin_pb2.AddAdminNoteReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def GetContentReport(
        self,
        request: admin_pb2.GetContentReportReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.GetContentReportRes, collections.abc.Awaitable[admin_pb2.GetContentReportRes]]: ...

    @abc.abstractmethod
    def GetContentReportsForAuthor(
        self,
        request: admin_pb2.GetContentReportsForAuthorReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.GetContentReportsForAuthorRes, collections.abc.Awaitable[admin_pb2.GetContentReportsForAuthorRes]]: ...

    @abc.abstractmethod
    def SendModNote(
        self,
        request: admin_pb2.SendModNoteReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def MarkUserNeedsLocationUpdate(
        self,
        request: admin_pb2.MarkUserNeedsLocationUpdateReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def DeleteUser(
        self,
        request: admin_pb2.DeleteUserReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def RecoverDeletedUser(
        self,
        request: admin_pb2.RecoverDeletedUserReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

    @abc.abstractmethod
    def CreateApiKey(
        self,
        request: admin_pb2.CreateApiKeyReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.CreateApiKeyRes, collections.abc.Awaitable[admin_pb2.CreateApiKeyRes]]:
        """Create an API key for a user. For security, we don't return the API key to the admin calling this API, rather
        it's sent to the user in an email
        """

    @abc.abstractmethod
    def GetChats(
        self,
        request: admin_pb2.GetChatsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.GetChatsRes, collections.abc.Awaitable[admin_pb2.GetChatsRes]]: ...

    @abc.abstractmethod
    def DeleteEvent(
        self,
        request: admin_pb2.DeleteEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def ListUserIds(
        self,
        request: admin_pb2.ListUserIdsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.ListUserIdsRes, collections.abc.Awaitable[admin_pb2.ListUserIdsRes]]: ...

    @abc.abstractmethod
    def EditReferenceText(
        self,
        request: admin_pb2.EditReferenceTextReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def DeleteReference(
        self,
        request: admin_pb2.DeleteReferenceReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def EditDiscussion(
        self,
        request: admin_pb2.EditDiscussionReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def EditReply(
        self,
        request: admin_pb2.EditReplyReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def AddUsersToModerationUserList(
        self,
        request: admin_pb2.AddUsersToModerationUserListReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.AddUsersToModerationUserListRes, collections.abc.Awaitable[admin_pb2.AddUsersToModerationUserListRes]]: ...

    @abc.abstractmethod
    def RemoveUserFromModerationUserList(
        self,
        request: admin_pb2.RemoveUserFromModerationUserListReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]: ...

    @abc.abstractmethod
    def ListModerationUserLists(
        self,
        request: admin_pb2.ListModerationUserListsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.ListModerationUserListsRes, collections.abc.Awaitable[admin_pb2.ListModerationUserListsRes]]: ...

    @abc.abstractmethod
    def CreateAccountDeletionLink(
        self,
        request: admin_pb2.CreateAccountDeletionLinkReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.CreateAccountDeletionLinkRes, collections.abc.Awaitable[admin_pb2.CreateAccountDeletionLinkRes]]: ...

    @abc.abstractmethod
    def AccessStats(
        self,
        request: admin_pb2.AccessStatsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.AccessStatsRes, collections.abc.Awaitable[admin_pb2.AccessStatsRes]]: ...

    @abc.abstractmethod
    def SetLastDonated(
        self,
        request: admin_pb2.SetLastDonatedReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[admin_pb2.UserDetails, collections.abc.Awaitable[admin_pb2.UserDetails]]: ...

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