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 events_pb2
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 EventsServicer(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def CreateEvent(
        self,
        request: events_pb2.CreateEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Creates an event, only one instance, add more with ScheduleEvent"""

    @abc.abstractmethod
    def ScheduleEvent(
        self,
        request: events_pb2.ScheduleEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Schedules a new occurrence of an existing event"""

    @abc.abstractmethod
    def UpdateEvent(
        self,
        request: events_pb2.UpdateEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Edit an event"""

    @abc.abstractmethod
    def GetEvent(
        self,
        request: events_pb2.GetEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Gets an event"""

    @abc.abstractmethod
    def CancelEvent(
        self,
        request: events_pb2.CancelEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Cancels an event"""

    @abc.abstractmethod
    def RequestCommunityInvite(
        self,
        request: events_pb2.RequestCommunityInviteReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Requests that a notification/email invitation about the event is sent out to the community"""

    @abc.abstractmethod
    def ListEventOccurrences(
        self,
        request: events_pb2.ListEventOccurrencesReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListEventOccurrencesRes, collections.abc.Awaitable[events_pb2.ListEventOccurrencesRes]]:
        """List all occurrences of a recurring event"""

    @abc.abstractmethod
    def ListEventAttendees(
        self,
        request: events_pb2.ListEventAttendeesReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListEventAttendeesRes, collections.abc.Awaitable[events_pb2.ListEventAttendeesRes]]:
        """Paginated list of event attendees"""

    @abc.abstractmethod
    def ListEventSubscribers(
        self,
        request: events_pb2.ListEventSubscribersReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListEventSubscribersRes, collections.abc.Awaitable[events_pb2.ListEventSubscribersRes]]:
        """Paginated list of event subscribers"""

    @abc.abstractmethod
    def ListEventOrganizers(
        self,
        request: events_pb2.ListEventOrganizersReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListEventOrganizersRes, collections.abc.Awaitable[events_pb2.ListEventOrganizersRes]]:
        """Paginated list of event organizers"""

    @abc.abstractmethod
    def TransferEvent(
        self,
        request: events_pb2.TransferEventReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Transfer an event you own to either a group or a community"""

    @abc.abstractmethod
    def SetEventSubscription(
        self,
        request: events_pb2.SetEventSubscriptionReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """Subscribe to get notifications about all occurrences of an event"""

    @abc.abstractmethod
    def SetEventAttendance(
        self,
        request: events_pb2.SetEventAttendanceReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.Event, collections.abc.Awaitable[events_pb2.Event]]:
        """RSVP/change going status for an occurrence of an event"""

    @abc.abstractmethod
    def InviteEventOrganizer(
        self,
        request: events_pb2.InviteEventOrganizerReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Invite another user to become an organizer of this event"""

    @abc.abstractmethod
    def RemoveEventOrganizer(
        self,
        request: events_pb2.RemoveEventOrganizerReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[google.protobuf.empty_pb2.Empty, collections.abc.Awaitable[google.protobuf.empty_pb2.Empty]]:
        """Remove yourself as an event organizer"""

    @abc.abstractmethod
    def ListMyEvents(
        self,
        request: events_pb2.ListMyEventsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListMyEventsRes, collections.abc.Awaitable[events_pb2.ListMyEventsRes]]:
        """Lists all subscribed, attending"""

    @abc.abstractmethod
    def ListAllEvents(
        self,
        request: events_pb2.ListAllEventsReq,
        context: CouchersContext,
        session: orm.Session,
    ) -> typing.Union[events_pb2.ListAllEventsRes, collections.abc.Awaitable[events_pb2.ListAllEventsRes]]:
        """Lists all events"""

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