from .travel_route import TravelRoute

class Event:
    id = 0
    name = ""
    location_name = []
    location_coordinates = []
    description = ""
    reviews = []
    category = []
    weather_requirements = 100 # highest tolerance
    date = ""
    image_path = "fallback.jpg"
    activity_duration = "" # datetime object
    trip_to = TravelRoute(0,0)
    trip_back = TravelRoute(0,0)

    def __init__(self, **kwargs):
        self.id = kwargs.pop("id")
        self.name = kwargs.pop("name")
        self.location_name = kwargs.pop("location_name")
        self.location_coordinates = kwargs.pop("location_coordinates")
        self.date = kwargs.pop("date")
        self.description = kwargs.pop("description")
        self.activity_duration = kwargs.pop("activity_duration")
        self.image_path = kwargs.pop("image_path")

    
    def find_optimal_trip(self):
        pass
    
    def add_review(self, **kwargs):
        self.reviews.append(Review(**kwargs))


    @property
    def trip_is_good(self):
        pass

    @property
    def co2_savings(self):
        return self.trip_to.co2_savings + self.trip_back.co2_savings
        
    @property
    def rating(self):
        return int(sum([r.rating for r in self.reviews]) / len(self.reviews))

    @property
    def nreviews(self):
        return len(self.reviews)

    @property
    def total_duration(self):
        s = (self.activity_duration + self.trip_back.duration + self.trip_to.duration).seconds
        hours, remainder = divmod(s, 3600)
        minutes, seconds = divmod(remainder, 60)
        return '{:02} h {:02}'.format(int(hours), int(minutes))




class Review:
    text = ""
    rating = 0 # max 5
    additional_photos = []


    def __init__(self, text, rating) -> None:
        self.text = text
        self.rating = rating


    def add_photo(self, photo):
        pass


class Events:
    _events = []

    def add_event(self, **kwargs):
        self._events.append(Event(**kwargs))

    def get_by_id(self, id):
        for e in self._events:
            if e.id == id:
                return e
        return None

    def __iter__(self):
        # todo fix broken iterator
        return iter(self._events)


    def filter_events(self, user, weather_score):
        # implement user preferences, geographic restrictions and weather conditions

        for e in self._events:
            if e.weather_requirements <= weather_score \
                or abs(e.location_coordinates[0] - user.home_coordinates[0]) + abs(e.location_coordinates[1] - user.home_coordinates[1]) >= 15 \
                    or not e.trip_is_good:
                        print("This event should be removed")