# Generated by the protocol buffer compiler.  DO NOT EDIT!
# sources: keyapis/ad/v1/keyapis_ad_marketplace_v1.proto, keyapis/ad/v1/keyapis_ad_salepoint_v1.proto, keyapis/ad/v1/keyapis_ad_system_v1.proto
# plugin: python-betterproto
from dataclasses import dataclass
from datetime import datetime
from typing import (
    TYPE_CHECKING,
    AsyncIterator,
    Dict,
    List,
    Optional,
)

import betterproto
import grpclib
from betterproto.grpc.grpclib_server import ServiceBase

if TYPE_CHECKING:
    import grpclib.server
    from betterproto.grpc.grpclib_client import MetadataLike
    from grpclib.metadata import Deadline


class MarketplaceType(betterproto.Enum):
    """Справочник типов маркетплейсов"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    OZON = 1
    """Озон"""

    WILDBERRIES = 2
    """Вайлдберриз"""

    YANDEX_MARKET = 3
    """Яндекс маркет"""

    SBER_MARKET = 4
    """Яндекс маркет"""


class SalepointType(betterproto.Enum):
    """Справочник типов точек продаж"""

    TYPE_UNKNOWN = 0
    """Значение не указано"""

    TELE2 = 1
    """Теле2"""

    POCHTA_ROSSII = 2
    """Почта россии"""

    PEREKRESTOK = 3
    """Перекресток"""

    PYATEROCHKA = 4
    """Пятерочка"""

    ANOTHER = 5
    """Другая"""

    MEGAFON = 6
    """Мегафон"""


class SalepointWorktimeDayType(betterproto.Enum):
    """Справочник дней"""

    DAY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    MONDAY = 1
    """Понедельник"""

    TUESDAY = 2
    """Вторник"""

    WEDNESDAY = 3
    """Среда"""

    THURSDAY = 4
    """Четверг"""

    FRIDAY = 5
    """Пятница"""

    SATURDAY = 6
    """Суббота"""

    SUNDAY = 7
    """Воскресенье"""


class SalepointPagingOrderByType(betterproto.Enum):
    """Справочник типов значений сортировки"""

    ORDER_BY_TYPE_UNKNOWN = 0
    """Значение не указано"""

    ID = 1
    """По идентификатору"""

    DISTANCE = 2
    """По дистанции"""

    RANK_CD = 3
    """По рангу близости. При поиске по тексту"""


class SalepointPagingDirectionType(betterproto.Enum):
    """Справочник типов направлений сортировки"""

    DIRECTION_TYPE_UNKNOWN = 0
    """Значение не указано"""

    DESC = 1
    """От большего к меньшему"""

    ASC = 2
    """От меньшего к большему"""


@dataclass(eq=False, repr=False)
class Marketplace(betterproto.Message):
    """Маркетплейс"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""

    title: str = betterproto.string_field(2)
    """Название"""

    type: "MarketplaceType" = betterproto.enum_field(3)
    """Тип маркетплейса"""

    is_disabled: bool = betterproto.bool_field(4)
    """Выключен ли маркетплейс"""

    card_url: Optional[str] = betterproto.message_field(
        5, wraps=betterproto.TYPE_STRING
    )
    """Ссылка на карточку товара ключа в маркетплейсе"""

    created_at: datetime = betterproto.message_field(6)
    """Дата создания"""

    changed_at: datetime = betterproto.message_field(7)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта
    """


@dataclass(eq=False, repr=False)
class PostMarketplaceRequest(betterproto.Message):
    """Запрос сохранения маркетплейса"""

    data: "Marketplace" = betterproto.message_field(1)
    """Маркетплейс"""


@dataclass(eq=False, repr=False)
class PostMarketplaceResponse(betterproto.Message):
    """Ответ на запрос сохранения маркетплейса"""

    data: "Marketplace" = betterproto.message_field(1, group="type")
    """Маркетплейс"""


@dataclass(eq=False, repr=False)
class GetMarketplaceRequest(betterproto.Message):
    """Запрос получения маркетплейса"""

    id: int = betterproto.int32_field(1)
    """Идентификатор маркетплейса"""


@dataclass(eq=False, repr=False)
class GetMarketplaceResponse(betterproto.Message):
    """Ответ на запрос получения маркетплейса"""

    data: "Marketplace" = betterproto.message_field(1, group="type")
    """Маркетплейс"""


@dataclass(eq=False, repr=False)
class GetMarketplaceListRequest(betterproto.Message):
    """Запрос получения списка маркетплейсов"""

    pass


@dataclass(eq=False, repr=False)
class GetMarketplaceListResponse(betterproto.Message):
    """Ответ на запрос получения списка маркетплейсов"""

    data: "Marketplace" = betterproto.message_field(1, group="type")
    """Маркетплейс"""


@dataclass(eq=False, repr=False)
class GetMarketplaceCountRequest(betterproto.Message):
    """Запрос получения количества маркетплейсов"""

    pass


@dataclass(eq=False, repr=False)
class GetMarketplaceCountResponse(betterproto.Message):
    """Ответ на запрос получения количества маркетплейсов"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего маркетплейсов"""


@dataclass(eq=False, repr=False)
class Salepoint(betterproto.Message):
    """Точка продаж"""

    id: int = betterproto.int32_field(1)
    """Идентификатор"""

    title: str = betterproto.string_field(2)
    """Название"""

    type: "SalepointType" = betterproto.enum_field(3)
    """Тип точки продаж"""

    description: Optional[str] = betterproto.message_field(
        4, wraps=betterproto.TYPE_STRING
    )
    """Описание"""

    address: str = betterproto.string_field(5)
    """Адрес"""

    location: "SalepointLocation" = betterproto.message_field(6)
    """Местонахождение"""

    worktimes: List["SalepointWorktime"] = betterproto.message_field(7)
    """Рабочее время"""

    phone_number: Optional[str] = betterproto.message_field(
        8, wraps=betterproto.TYPE_STRING
    )
    """Номер телефона"""

    site_url: str = betterproto.string_field(9)
    """Ссылка на сайт"""

    created_at: datetime = betterproto.message_field(10)
    """Дата создания"""

    changed_at: datetime = betterproto.message_field(11)
    """
    Дата последнего изменения. Заполняется и обновляется сервером. Заполняется
    при создании и изменении. Является версией объекта
    """

    archieved_at: datetime = betterproto.message_field(12)
    """Дата архивации"""


@dataclass(eq=False, repr=False)
class SalepointLocation(betterproto.Message):
    """Местонахождение"""

    latitude: float = betterproto.float_field(1)
    """Широта"""

    longitude: float = betterproto.float_field(2)
    """Долгота"""


@dataclass(eq=False, repr=False)
class SalepointWorktime(betterproto.Message):
    """Рабочее время"""

    day_type: "SalepointWorktimeDayType" = betterproto.enum_field(1)
    """День недели"""

    opened_at: str = betterproto.string_field(2)
    """Время открытия"""

    closed_at: str = betterproto.string_field(3)
    """Время закрытия"""


@dataclass(eq=False, repr=False)
class SalepointFilter(betterproto.Message):
    """Фильтр точек продаж"""

    text: Optional[str] = betterproto.message_field(1, wraps=betterproto.TYPE_STRING)
    """
    По тексту. Если значение не передано то поиск по нему не производится. #
    Поиск производится по полям: # - Название
    """

    location: "SalepointFilterLocation" = betterproto.message_field(2)
    """По местонахождению. Игнорируется если дистанция не передана"""

    distance: Optional[float] = betterproto.message_field(
        3, wraps=betterproto.TYPE_FLOAT
    )
    """По дистанции. Игнорируется если местонахождение не передано"""

    is_archieved: Optional[bool] = betterproto.message_field(
        4, wraps=betterproto.TYPE_BOOL
    )
    """По архивированым"""


@dataclass(eq=False, repr=False)
class SalepointFilterLocation(betterproto.Message):
    """Местонахождение"""

    latitude: float = betterproto.float_field(1)
    """По широте"""

    longitude: float = betterproto.float_field(2)
    """По долготе"""


@dataclass(eq=False, repr=False)
class SalepointPaging(betterproto.Message):
    """Пагинация по точекам продаж"""

    order_by_type: "SalepointPagingOrderByType" = betterproto.enum_field(1)
    """Тип значения сортировки. По умолчанию: ORDER_BY_TYPE_ID"""

    direction_type: "SalepointPagingDirectionType" = betterproto.enum_field(2)
    """Тип направления сортировки. По умолчанию: DESC"""

    limit: int = betterproto.int32_field(3)
    """
    Количество записей на страницу. Минимальное значение: 1. Максимальное
    значение: 100. По умолчанию: 20. Если значение 0 (не передано), то
    выставляем значение по умолчанию
    """

    offset: int = betterproto.int32_field(4)
    """Сдвиг. По умолчанию: 0"""


@dataclass(eq=False, repr=False)
class PostSalepointRequest(betterproto.Message):
    """Запрос сохранения точки продаж"""

    data: "Salepoint" = betterproto.message_field(1)
    """Точка продаж"""


@dataclass(eq=False, repr=False)
class PostSalepointResponse(betterproto.Message):
    """Ответ на запрос сохранения точки продаж"""

    data: "Salepoint" = betterproto.message_field(1, group="type")
    """Точка продаж"""


@dataclass(eq=False, repr=False)
class GetSalepointRequest(betterproto.Message):
    """Запрос получения точки продаж"""

    id: int = betterproto.int32_field(1)
    """Идентификатор точки продаж"""


@dataclass(eq=False, repr=False)
class GetSalepointResponse(betterproto.Message):
    """Ответ на запрос получения точки продаж"""

    data: "Salepoint" = betterproto.message_field(1, group="type")
    """Точка продаж"""


@dataclass(eq=False, repr=False)
class GetSalepointListRequest(betterproto.Message):
    """Запрос получения списка точек продаж"""

    filter: "SalepointFilter" = betterproto.message_field(1)
    """Фильтр"""

    paging: "SalepointPaging" = betterproto.message_field(2, group="pagination")
    """Пагинация"""


@dataclass(eq=False, repr=False)
class GetSalepointListResponse(betterproto.Message):
    """Ответ на запрос получения списка точек продаж"""

    data: "Salepoint" = betterproto.message_field(1, group="type")
    """Точка продаж"""


@dataclass(eq=False, repr=False)
class GetSalepointCountRequest(betterproto.Message):
    """Запрос получения количества точек продаж"""

    filter: "SalepointFilter" = betterproto.message_field(1)
    """Фильтр"""


@dataclass(eq=False, repr=False)
class GetSalepointCountResponse(betterproto.Message):
    """Ответ на запрос получения количества точек продаж"""

    data: int = betterproto.int32_field(1, group="type")
    """Всего точек продаж"""


@dataclass(eq=False, repr=False)
class GetSystemStatusRequest(betterproto.Message):
    """Запрос проверки доступности сервиса"""

    pass


@dataclass(eq=False, repr=False)
class GetSystemStatusResponse(betterproto.Message):
    """Ответ на запрос проверки доступности сервиса"""

    pass


class MarketplaceServiceStub(betterproto.ServiceStub):
    async def post_marketplace(
        self,
        post_marketplace_request: "PostMarketplaceRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostMarketplaceResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.MarketplaceService/PostMarketplace",
            post_marketplace_request,
            PostMarketplaceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_marketplace(
        self,
        get_marketplace_request: "GetMarketplaceRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetMarketplaceResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.MarketplaceService/GetMarketplace",
            get_marketplace_request,
            GetMarketplaceResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_marketplace_list(
        self,
        get_marketplace_list_request: "GetMarketplaceListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetMarketplaceListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.ad.v1.MarketplaceService/GetMarketplaceList",
            get_marketplace_list_request,
            GetMarketplaceListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_marketplace_count(
        self,
        get_marketplace_count_request: "GetMarketplaceCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetMarketplaceCountResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.MarketplaceService/GetMarketplaceCount",
            get_marketplace_count_request,
            GetMarketplaceCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SalepointServiceStub(betterproto.ServiceStub):
    async def post_salepoint(
        self,
        post_salepoint_request: "PostSalepointRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "PostSalepointResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.SalepointService/PostSalepoint",
            post_salepoint_request,
            PostSalepointResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_salepoint(
        self,
        get_salepoint_request: "GetSalepointRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSalepointResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.SalepointService/GetSalepoint",
            get_salepoint_request,
            GetSalepointResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )

    async def get_salepoint_list(
        self,
        get_salepoint_list_request: "GetSalepointListRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> AsyncIterator["GetSalepointListResponse"]:
        async for response in self._unary_stream(
            "/keyapis.ad.v1.SalepointService/GetSalepointList",
            get_salepoint_list_request,
            GetSalepointListResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        ):
            yield response

    async def get_salepoint_count(
        self,
        get_salepoint_count_request: "GetSalepointCountRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSalepointCountResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.SalepointService/GetSalepointCount",
            get_salepoint_count_request,
            GetSalepointCountResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class SystemServiceStub(betterproto.ServiceStub):
    async def get_system_status(
        self,
        get_system_status_request: "GetSystemStatusRequest",
        *,
        timeout: Optional[float] = None,
        deadline: Optional["Deadline"] = None,
        metadata: Optional["MetadataLike"] = None
    ) -> "GetSystemStatusResponse":
        return await self._unary_unary(
            "/keyapis.ad.v1.SystemService/GetSystemStatus",
            get_system_status_request,
            GetSystemStatusResponse,
            timeout=timeout,
            deadline=deadline,
            metadata=metadata,
        )


class MarketplaceServiceBase(ServiceBase):

    async def post_marketplace(
        self, post_marketplace_request: "PostMarketplaceRequest"
    ) -> "PostMarketplaceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_marketplace(
        self, get_marketplace_request: "GetMarketplaceRequest"
    ) -> "GetMarketplaceResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_marketplace_list(
        self, get_marketplace_list_request: "GetMarketplaceListRequest"
    ) -> AsyncIterator["GetMarketplaceListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_marketplace_count(
        self, get_marketplace_count_request: "GetMarketplaceCountRequest"
    ) -> "GetMarketplaceCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_marketplace(
        self,
        stream: "grpclib.server.Stream[PostMarketplaceRequest, PostMarketplaceResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_marketplace(request)
        await stream.send_message(response)

    async def __rpc_get_marketplace(
        self,
        stream: "grpclib.server.Stream[GetMarketplaceRequest, GetMarketplaceResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_marketplace(request)
        await stream.send_message(response)

    async def __rpc_get_marketplace_list(
        self,
        stream: "grpclib.server.Stream[GetMarketplaceListRequest, GetMarketplaceListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_marketplace_list,
            stream,
            request,
        )

    async def __rpc_get_marketplace_count(
        self,
        stream: "grpclib.server.Stream[GetMarketplaceCountRequest, GetMarketplaceCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_marketplace_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.ad.v1.MarketplaceService/PostMarketplace": grpclib.const.Handler(
                self.__rpc_post_marketplace,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostMarketplaceRequest,
                PostMarketplaceResponse,
            ),
            "/keyapis.ad.v1.MarketplaceService/GetMarketplace": grpclib.const.Handler(
                self.__rpc_get_marketplace,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetMarketplaceRequest,
                GetMarketplaceResponse,
            ),
            "/keyapis.ad.v1.MarketplaceService/GetMarketplaceList": grpclib.const.Handler(
                self.__rpc_get_marketplace_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetMarketplaceListRequest,
                GetMarketplaceListResponse,
            ),
            "/keyapis.ad.v1.MarketplaceService/GetMarketplaceCount": grpclib.const.Handler(
                self.__rpc_get_marketplace_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetMarketplaceCountRequest,
                GetMarketplaceCountResponse,
            ),
        }


class SalepointServiceBase(ServiceBase):

    async def post_salepoint(
        self, post_salepoint_request: "PostSalepointRequest"
    ) -> "PostSalepointResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_salepoint(
        self, get_salepoint_request: "GetSalepointRequest"
    ) -> "GetSalepointResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_salepoint_list(
        self, get_salepoint_list_request: "GetSalepointListRequest"
    ) -> AsyncIterator["GetSalepointListResponse"]:
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def get_salepoint_count(
        self, get_salepoint_count_request: "GetSalepointCountRequest"
    ) -> "GetSalepointCountResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_post_salepoint(
        self,
        stream: "grpclib.server.Stream[PostSalepointRequest, PostSalepointResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.post_salepoint(request)
        await stream.send_message(response)

    async def __rpc_get_salepoint(
        self, stream: "grpclib.server.Stream[GetSalepointRequest, GetSalepointResponse]"
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_salepoint(request)
        await stream.send_message(response)

    async def __rpc_get_salepoint_list(
        self,
        stream: "grpclib.server.Stream[GetSalepointListRequest, GetSalepointListResponse]",
    ) -> None:
        request = await stream.recv_message()
        await self._call_rpc_handler_server_stream(
            self.get_salepoint_list,
            stream,
            request,
        )

    async def __rpc_get_salepoint_count(
        self,
        stream: "grpclib.server.Stream[GetSalepointCountRequest, GetSalepointCountResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_salepoint_count(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.ad.v1.SalepointService/PostSalepoint": grpclib.const.Handler(
                self.__rpc_post_salepoint,
                grpclib.const.Cardinality.UNARY_UNARY,
                PostSalepointRequest,
                PostSalepointResponse,
            ),
            "/keyapis.ad.v1.SalepointService/GetSalepoint": grpclib.const.Handler(
                self.__rpc_get_salepoint,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSalepointRequest,
                GetSalepointResponse,
            ),
            "/keyapis.ad.v1.SalepointService/GetSalepointList": grpclib.const.Handler(
                self.__rpc_get_salepoint_list,
                grpclib.const.Cardinality.UNARY_STREAM,
                GetSalepointListRequest,
                GetSalepointListResponse,
            ),
            "/keyapis.ad.v1.SalepointService/GetSalepointCount": grpclib.const.Handler(
                self.__rpc_get_salepoint_count,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSalepointCountRequest,
                GetSalepointCountResponse,
            ),
        }


class SystemServiceBase(ServiceBase):

    async def get_system_status(
        self, get_system_status_request: "GetSystemStatusRequest"
    ) -> "GetSystemStatusResponse":
        raise grpclib.GRPCError(grpclib.const.Status.UNIMPLEMENTED)

    async def __rpc_get_system_status(
        self,
        stream: "grpclib.server.Stream[GetSystemStatusRequest, GetSystemStatusResponse]",
    ) -> None:
        request = await stream.recv_message()
        response = await self.get_system_status(request)
        await stream.send_message(response)

    def __mapping__(self) -> Dict[str, grpclib.const.Handler]:
        return {
            "/keyapis.ad.v1.SystemService/GetSystemStatus": grpclib.const.Handler(
                self.__rpc_get_system_status,
                grpclib.const.Cardinality.UNARY_UNARY,
                GetSystemStatusRequest,
                GetSystemStatusResponse,
            ),
        }
