# Path: src/booking/source/event/model/Event.py
# class Event(metaclass=ABCMeta):
# 
#     """
#     Interface that represents a generic event
#     """
# 
#     @abstractmethod
#     def get_classroom_identifier(self) -> str:
#         """Returns the classroom identifier where will be the event."""
#         pass
# 
#     @abstractmethod
#     def get_name(self) -> str:
#         """
#         Returns the name of the event
#         :rtype: str representing the name of the event
#         """
#         pass
# 
#     @abstractmethod
#     def get_description(self) -> str:
#         """Return a short description of the event"""
#         pass
# 
#     @abstractmethod
#     def get_begin(self) -> datetime:
#         """Returns the date time representing when the event start"""
#         pass
# 
#     @abstractmethod
#     def get_end(self) -> datetime:
#         """Returns the date time representing when is the event end"""
#         pass
# 
#     def __str__(self):
#         return self.get_name() + "\n" + \
#                self.get_classroom_identifier() + "\n" + \
#                str(self.get_begin()) + "\n" + \
#                str(self.get_end()) + "\n" + \
#                self.get_description()


from abc import ABCMeta, abstractmethod
from datetime import datetime
from typing import List
from .model import Event



class EventsSource(metaclass=ABCMeta):

    """
    Class that have the responsibility to save the events and to provide access to them.
    """

    @abstractmethod
    def add_event(self, event: Event):
        """
        Adds an events to the source.
        :param event: Event that will be added.
        """
        pass

    @abstractmethod

# Path: src/booking/source/event/model/Event.py
# class Event(metaclass=ABCMeta):
# 
#     """
#     Interface that represents a generic event
#     """
# 
#     @abstractmethod
#     def get_classroom_identifier(self) -> str:
#         """Returns the classroom identifier where will be the event."""
#         pass
# 
#     @abstractmethod
#     def get_name(self) -> str:
#         """
#         Returns the name of the event
#         :rtype: str representing the name of the event
#         """
#         pass
# 
#     @abstractmethod
#     def get_description(self) -> str:
#         """Return a short description of the event"""
#         pass
# 
#     @abstractmethod
#     def get_begin(self) -> datetime:
#         """Returns the date time representing when the event start"""
#         pass
# 
#     @abstractmethod
#     def get_end(self) -> datetime:
#         """Returns the date time representing when is the event end"""
#         pass
# 
#     def __str__(self):
#         return self.get_name() + "\n" + \
#                self.get_classroom_identifier() + "\n" + \
#                str(self.get_begin()) + "\n" + \
#                str(self.get_end()) + "\n" + \
#                self.get_description()


# Path: src/booking/source/event/EventsSource.py
from abc import ABCMeta, abstractmethod
from datetime import datetime
from typing import List
from .model import Event




class EventsSource(metaclass=ABCMeta):

    """
    Class that have the responsibility to save the events and to provide access to them.
    """

    @abstractmethod
    def add_event(self, event: Event):
        """
        Adds an events to the source.
        :param event: Event that will be added.
        """
        pass

    @abstractmethod

    def get_next_event(self, classroom_identifier: str, date_time: datetime) -> Event: