from pydantic import BaseModel, Field
from pymemcache.client.base import Client

from .linked_landmarks import LinkedLandmarks
import uuid

class Trip(BaseModel):
    uuid: str = Field(default_factory=uuid.uuid4)
    total_time: int
    first_landmark_uuid: str


    @classmethod
    def from_linked_landmarks(self, landmarks: LinkedLandmarks, cache_client: Client) -> "Trip":
        """
        Initialize a new Trip object and ensure it is stored in the cache.
        """
        trip = Trip(
            total_time = landmarks.total_time,
            first_landmark_uuid = str(landmarks[0].uuid)
        )

        # Store the trip in the cache
        cache_client.set(f"trip_{trip.uuid}", trip)
        # make sure to await the result (noreply=False). Otherwise the cache might not be inplace when the trip is actually requested
        cache_client.set_many({f"landmark_{landmark.uuid}": landmark for landmark in landmarks}, expire=3600, noreply=False)
        # is equivalent to:
        # for landmark in landmarks:
        #     cache_client.set(f"landmark_{landmark.uuid}", landmark, expire=3600)

        return trip