from __future__ import annotations
from dataclasses import dataclass, field
from typing import ForwardRef
from xsdata.models.datatype import XmlTime
from .connecting_journey_view import ConnectingJourneyView
from .connection_ref_structure import ConnectionRefStructure
from .dated_special_service_ref import DatedSpecialServiceRef
from .dated_vehicle_journey_ref import DatedVehicleJourneyRef
from .dead_run_ref import DeadRunRef
from .entity_in_version_structure import DataManagedObjectStructure
from .flexible_line_ref import FlexibleLineRef
from .journey_ref_structure import JourneyRefStructure
from .line_derived_view_structure import LineDerivedViewStructure
from .line_ref import LineRef
from .multilingual_string import MultilingualString
from .normal_dated_vehicle_journey_ref import NormalDatedVehicleJourneyRef
from .point_in_journey_pattern_ref_structure import PointInJourneyPatternRefStructure
from .reason_for_meeting_enumeration import ReasonForMeetingEnumeration
from .scheduled_stop_point_ref_structure import ScheduledStopPointRefStructure
from .service_journey_ref import ServiceJourneyRef
from .service_journey_ref_structure import ServiceJourneyRefStructure
from .single_journey_ref import SingleJourneyRef
from .special_service_ref import SpecialServiceRef
from .stop_point_in_journey_pattern_ref_structure import StopPointInJourneyPatternRefStructure
from .template_service_journey_ref import TemplateServiceJourneyRef
from .vehicle_journey_ref import VehicleJourneyRef

__NAMESPACE__ = "http://www.netex.org.uk/netex"


@dataclass(slots=True, kw_only=True)
class JourneyMeetingVersionStructure(DataManagedObjectStructure):
    class Meta:
        name = "JourneyMeeting_VersionStructure"

    name: None | MultilingualString = field(
        default=None,
        metadata={
            "name": "Name",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    at_stop_point_ref: None | ScheduledStopPointRefStructure = field(
        default=None,
        metadata={
            "name": "AtStopPointRef",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    from_journey_ref_or_to_journey_ref_or_from_point_in_journey_pattern_ref_or_to_point_in_journey_pattern_ref_or_from_service_journey_ref_or_to_service_journey_ref_or_from_stop_point_in_journey_pattern_ref_or_to_stop_point_in_journey_pattern_ref: list[JourneyMeetingVersionStructure.FromJourneyRef | JourneyMeetingVersionStructure.ToJourneyRef | JourneyMeetingVersionStructure.FromPointInJourneyPatternRef | JourneyMeetingVersionStructure.ToPointInJourneyPatternRef | JourneyMeetingVersionStructure.FromServiceJourneyRef | JourneyMeetingVersionStructure.ToServiceJourneyRef | JourneyMeetingVersionStructure.FromStopPointInJourneyPatternRef | JourneyMeetingVersionStructure.ToStopPointInJourneyPatternRef] = field(
        default_factory=list,
        metadata={
            "type": "Elements",
            "choices": (
                {
                    "name": "FromJourneyRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.FromJourneyRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ToJourneyRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.ToJourneyRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "FromPointInJourneyPatternRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.FromPointInJourneyPatternRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ToPointInJourneyPatternRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.ToPointInJourneyPatternRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "FromServiceJourneyRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.FromServiceJourneyRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ToServiceJourneyRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.ToServiceJourneyRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "FromStopPointInJourneyPatternRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.FromStopPointInJourneyPatternRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ToStopPointInJourneyPatternRef",
                    "type": ForwardRef("JourneyMeetingVersionStructure.ToStopPointInJourneyPatternRef"),
                    "namespace": "http://www.netex.org.uk/netex",
                },
            ),
            "max_occurs": 4,
        }
    )
    description: None | MultilingualString = field(
        default=None,
        metadata={
            "name": "Description",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    earliest_time: None | XmlTime = field(
        default=None,
        metadata={
            "name": "EarliestTime",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    earliest_time_day_offset: None | int = field(
        default=None,
        metadata={
            "name": "EarliestTimeDayOffset",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    latest_time: None | XmlTime = field(
        default=None,
        metadata={
            "name": "LatestTime",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    latest_time_day_offset: None | int = field(
        default=None,
        metadata={
            "name": "LatestTimeDayOffset",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    reason: None | ReasonForMeetingEnumeration = field(
        default=None,
        metadata={
            "name": "Reason",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    connection_ref: None | ConnectionRefStructure = field(
        default=None,
        metadata={
            "name": "ConnectionRef",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    connecting_stop_point_ref: list[ScheduledStopPointRefStructure] = field(
        default_factory=list,
        metadata={
            "name": "ConnectingStopPointRef",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    connecting_stop_point_name: list[MultilingualString] = field(
        default_factory=list,
        metadata={
            "name": "ConnectingStopPointName",
            "type": "Element",
            "namespace": "http://www.netex.org.uk/netex",
        }
    )
    single_journey_ref_or_normal_dated_vehicle_journey_ref_or_dated_vehicle_journey_ref_or_dated_special_service_ref_or_special_service_ref_or_template_service_journey_ref_or_service_journey_ref_or_dead_run_ref_or_vehicle_journey_ref_or_connecting_journey_view: None | SingleJourneyRef | NormalDatedVehicleJourneyRef | DatedVehicleJourneyRef | DatedSpecialServiceRef | SpecialServiceRef | TemplateServiceJourneyRef | ServiceJourneyRef | DeadRunRef | VehicleJourneyRef | ConnectingJourneyView = field(
        default=None,
        metadata={
            "type": "Elements",
            "choices": (
                {
                    "name": "SingleJourneyRef",
                    "type": SingleJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "NormalDatedVehicleJourneyRef",
                    "type": NormalDatedVehicleJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "DatedVehicleJourneyRef",
                    "type": DatedVehicleJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "DatedSpecialServiceRef",
                    "type": DatedSpecialServiceRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "SpecialServiceRef",
                    "type": SpecialServiceRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "TemplateServiceJourneyRef",
                    "type": TemplateServiceJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ServiceJourneyRef",
                    "type": ServiceJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "DeadRunRef",
                    "type": DeadRunRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "VehicleJourneyRef",
                    "type": VehicleJourneyRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ConnectingJourneyView",
                    "type": ConnectingJourneyView,
                    "namespace": "http://www.netex.org.uk/netex",
                },
            ),
        }
    )
    flexible_line_ref_or_line_ref_or_connecting_line_view: None | FlexibleLineRef | LineRef | LineDerivedViewStructure = field(
        default=None,
        metadata={
            "type": "Elements",
            "choices": (
                {
                    "name": "FlexibleLineRef",
                    "type": FlexibleLineRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "LineRef",
                    "type": LineRef,
                    "namespace": "http://www.netex.org.uk/netex",
                },
                {
                    "name": "ConnectingLineView",
                    "type": LineDerivedViewStructure,
                    "namespace": "http://www.netex.org.uk/netex",
                },
            ),
        }
    )

    @dataclass(slots=True, kw_only=True)
    class FromJourneyRef(JourneyRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class ToJourneyRef(JourneyRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class FromPointInJourneyPatternRef(PointInJourneyPatternRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class ToPointInJourneyPatternRef(PointInJourneyPatternRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class FromServiceJourneyRef(ServiceJourneyRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class ToServiceJourneyRef(ServiceJourneyRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class FromStopPointInJourneyPatternRef(StopPointInJourneyPatternRefStructure):
        pass

    @dataclass(slots=True, kw_only=True)
    class ToStopPointInJourneyPatternRef(StopPointInJourneyPatternRefStructure):
        pass