try:
    from zope.interface import Interface, Attribute
except ImportError:
    class Interface:
        """A dummy interface base class"""

    class Attribute:
        """A dummy attribute implementation"""
        def __init__(self, doc):
            self.doc = doc

_marker = object()

class IComponent(Interface):
    """
    Component is the base object for calendar, Event and the other
    components defined in RFC 2445.

    A component is like a dictionary with extra methods and attributes.
    """

    # MANIPULATORS

    def __setitem__(name, value):
        """Set a property.

        name - case insensitive name
        value - value of the property to set. This can be either a single
        item or a list.

        Some iCalendar properties are set INLINE; these properties
        have multiple values on one property line in the iCalendar
        representation.  The list can be supplied as a comma separated
        string to __setitem__. If special iCalendar characters exist in
        an entry, such as the colon (:) and (,), that comma-separated
        entry needs to be quoted with double quotes. For example:

        'foo, bar, "baz:hoi"'

        See also set_inline() for an easier way to deal with this case.
        """

    def set_inline(name, values, encode=1):
        """Set list of INLINE values for property.

        Converts a list of values into valid iCalendar comma seperated
        string and sets value to that.

        name - case insensitive name of property
        values - list of values to set
        encode - if True, encode Python values as iCalendar types first.
        """

    def add(name, value):
        """Add a property. Can be called multiple times to set a list.

        name - case insensitive name
        value - value of property to set or add to list for this property.
        """

    def add_component(component):
        """Add a nested subcomponent to this component.
        """

    # static method, can be called on class directly
    def from_string(st, multiple=False):
        """Populates the component recursively from a iCalendar string.

        Reads the iCalendar string and constructs components and
        subcomponents out of it.
        """

    # ACCESSORS
    def __getitem__(name):
        """Get a property

        name - case insensitive name

        Returns an iCalendar property object such as vText.
        """

    def decoded(name, default=_marker):
        """Get a property as a python object.

        name - case insensitive name
        default - optional argument. If supplied, will use this if
        name cannot be found. If not supplied, decoded will raise a
        KeyError if name cannot be found.

        Returns python object (such as unicode string, datetime, etc).
        """

    def get_inline(name, decode=1):
        """Get list of INLINE values from property.

        name - case insensitive name
        decode - decode to Python objects.

        Returns list of python objects.
        """

    def as_string():
        """Render the component in the RFC 2445 (iCalendar) format.

        Returns a string in RFC 2445 format.
        """

    subcomponents = Attribute("""
        A list of all subcomponents of this component,
        added using add_component()""")

    name = Attribute("""
        Name of this component (VEVENT, etc)
        """)

    def walk(name=None):
        """Recursively traverses component and subcomponents.

        name - optional, if given, only return components with that name

        Returns sequence of components.
        """

    def property_items():
        """Return properties as (name, value) tuples.

        Returns all properties in this comopnent and subcomponents as
        name, value tuples.
        """

class IEvent(IComponent):
    """A component which conforms to an iCalendar VEVENT.
    """

class ITodo(IComponent):
    """A component which conforms to an iCalendar VTODO.
    """

class IJournal(IComponent):
    """A component which conforms to an iCalendar VJOURNAL.
    """

class IFreeBusy(IComponent):
    """A component which conforms to an iCalendar VFREEBUSY.
    """

class ITimezone(IComponent):
    """A component which conforms to an iCalendar VTIMEZONE.
    """

class IAlarm(IComponent):
    """A component which conforms to an iCalendar VALARM.
    """

class ICalendar(IComponent):
    """A component which conforms to an iCalendar VCALENDAR.
    """

class IPropertyValue(Interface):
    """An iCalendar property value.
    iCalendar properties have strongly typed values.

    This invariance should always be true:

    assert x == vDataType.from_ical(vDataType(x).ical())
    """

    def ical():
        """Render property as string, as defined in iCalendar RFC 2445.
        """

    # this is a static method
    def from_ical(ical):
        """Parse property from iCalendar RFC 2445 text.

        Inverse of ical().
        """

class IBinary(IPropertyValue):
    """Binary property values are base 64 encoded
    """

class IBoolean(IPropertyValue):
    """Boolean property.

    Also behaves like a python int.
    """

class ICalAddress(IPropertyValue):
    """Email address.

    Also behaves like a python str.
    """

class IDateTime(IPropertyValue):
    """Render and generates iCalendar datetime format.

    Important: if tzinfo is defined it renders itself as 'date with utc time'
    Meaning that it has a 'Z' appended, and is in absolute time.
    """

class IDate(IPropertyValue):
    """Render and generates iCalendar date format.
    """

class IDuration(IPropertyValue):
    """Render and generates timedelta in iCalendar DURATION format.
    """

class IFloat(IPropertyValue):
    """Render and generate floats in iCalendar format.

    Also behaves like a python float.
    """

class IInt(IPropertyValue):
    """Render and generate ints in iCalendar format.

    Also behaves like a python int.
    """

class IPeriod(IPropertyValue):
    """A precise period of time (datetime, datetime).
    """

class IWeekDay(IPropertyValue):
    """Render and generate weekday abbreviation.
    """

class IFrequency(IPropertyValue):
    """Frequency.
    """

class IRecur(IPropertyValue):
    """Render and generate data based on recurrent event representation.

    This acts like a caseless dictionary.
    """

class IText(IPropertyValue):
    """Unicode text.
    """

class ITime(IPropertyValue):
    """Time.
    """

class IUri(IPropertyValue):
    """URI
    """

class IGeo(IPropertyValue):
    """Geographical location.
    """

class IUTCOffset(IPropertyValue):
    """Offset from UTC.
    """

class IInline(IPropertyValue):
    """Inline list.
    """
