from __future__ import annotations
from typing import TYPE_CHECKING

from typing import List, Optional, Union


from pydantic.v1 import Field
from pydantic2_schemaorg.Place import Place


class TouristDestination(Place):
    """A tourist destination. In principle any [[Place]] can be a [[TouristDestination]] from a [[City]], Region
     or [[Country]] to an [[AmusementPark]] or [[Hotel]]. This Type can be used on its own to describe a general
     [[TouristDestination]], or be used as an [[additionalType]] to add tourist relevant properties to any other
     [[Place]]. A [[TouristDestination]] is defined as a [[Place]] that contains, or is colocated with, one or
     more [[TouristAttraction]]s, often linked by a similar theme or interest to a particular [[touristType]].
     The [UNWTO](http://www2.unwto.org/) defines Destination (main destination of a tourism trip) as the place
     visited that is central to the decision to take the trip. (See examples below.)

    See: https://schema.org/TouristDestination
    Model depth: 3
    """

    type_: str = Field(default="TouristDestination", alias="@type", const=True)
    touristType: Optional[
        Union[List[Union[str, "Text", "Audience"]], str, "Text", "Audience"]
    ] = Field(
        default=None,
        description="Attraction suitable for type(s) of tourist. E.g. children, visitors from a particular country, etc.",
    )
    includesAttraction: Optional[
        Union[List[Union["TouristAttraction", str]], "TouristAttraction", str]
    ] = Field(
        default=None,
        description="Attraction located at destination.",
    )


if TYPE_CHECKING:
    from pydantic2_schemaorg.Text import Text
    from pydantic2_schemaorg.Audience import Audience
    from pydantic2_schemaorg.TouristAttraction import TouristAttraction
