""" Options:
Date: 2025-04-06 06:25:31
Version: 8.52
Tip: To override a DTO option, remove "#" prefix before updating
BaseUrl: https://taxfiling.pwc.de

#GlobalNamespace: 
#AddServiceStackTypes: True
#AddResponseStatus: False
#AddImplicitVersion: 
#AddDescriptionAsComments: True
IncludeTypes: RetrieveAllProductsAsync.*
#ExcludeTypes: 
#DefaultImports: datetime,decimal,marshmallow.fields:*,servicestack:*,typing:*,dataclasses:dataclass/field,dataclasses_json:dataclass_json/LetterCase/Undefined/config,enum:Enum/IntEnum
#DataClass: 
#DataClassJson: 
"""

import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


class IPaginate:
    skip: Optional[int] = None
    take: Optional[int] = None


# @Api(Description="The number of query results to skip.")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PaginationBase(IPaginate):
    """
    The number of query results to skip.
    """

    # @ApiMember(Description="The number of query results to skip.")
    skip: Optional[int] = None
    """
    The number of query results to skip.
    """


    # @ApiMember(Description="The number of query results to include.")
    take: Optional[int] = None
    """
    The number of query results to include.
    """


# @Api(Description="Specifies a service to retrieve all products.")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RetrieveAllProductsBase(PaginationBase, IReturn[ProductQueryResponse], IGet):
    """
    Specifies a service to retrieve all products.
    """

    # @ApiMember(Description="Should the related orders of the account be included in the retrieved products?")
    include_orders: Optional[bool] = None
    """
    Should the related orders of the account be included in the retrieved products?
    """


    # @ApiMember(Description="Specifies the number of orders to skip per product. Applicable only when 'IncludeOrders' is true. ")
    skip_orders: Optional[int] = None
    """
    Specifies the number of orders to skip per product. Applicable only when 'IncludeOrders' is true. 
    """


    # @ApiMember(Description="Specifies the number of orders to include per product. Applicable only when 'IncludeOrders' is true. ")
    take_orders: Optional[int] = None
    """
    Specifies the number of orders to include per product. Applicable only when 'IncludeOrders' is true. 
    """
    @staticmethod
    def response_type(): return ProductQueryResponse


# @Api(Description="Represents a product.")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Product(IHasName):
    """
    Represents a product.
    """

    # @ApiMember(Description="The unique identifier of the product.", IsRequired=true)
    id: int = 0
    """
    The unique identifier of the product.
    """


    # @ApiMember(Description="The position of this instance in a collection of 'Product' instances", IsRequired=true)
    index: int = 0
    """
    The position of this instance in a collection of 'Product' instances
    """


    # @ApiMember(Description="The name of the product.", IsRequired=true)
    # @Validate(Validator="NotEmpty")
    name: Optional[str] = None
    """
    The name of the product.
    """


    # @ApiMember(Description="The version of the product.", IsRequired=true)
    # @Validate(Validator="NotEmpty")
    version: Optional[str] = None
    """
    The version of the product.
    """


    # @ApiMember(Description="The version of the product.")
    description: Optional[str] = None
    """
    The version of the product.
    """


    # @ApiMember(Description="Tags associated with the product.")
    tags: List[str] = field(default_factory=list)
    """
    Tags associated with the product.
    """


class IHasName:
    """
     Specifies that a data type should have a 'Name' property.
    """

    name: Optional[str] = None
    """
    The 'Name' property.
    """


# @Api(Description="Represents a query response that contains a structured error information and encapsulates products.")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ProductQueryResponse(QueryResponse[Product]):
    """
    Represents a query response that contains a structured error information and encapsulates products.
    """

    # @ApiMember(Description="The dictionary of orders associated with each found product.")
    orders_map: Dict[int, List[Order]] = field(default_factory=dict)
    """
    The dictionary of orders associated with each found product.
    """


# @Route("/async/products", "GET")
# @Api(Description="Represents a service request to retrieve all products in an asynchronous operation.")
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RetrieveAllProductsAsync(RetrieveAllProductsBase, IReturn[ProductQueryResponse]):
    """
    Represents a service request to retrieve all products in an asynchronous operation.
    """

    pass