
from zope.interface import implements, implementsOnly, Interface
from zope.component import adapts, getGlobalSiteManager

from graph.interfaces import ITickLabelAdapter
from graph.interfaces import IAxis
from graph.interfaces import IViewBox
from graph.interfaces import IImage
from graph.interfaces import IBaseAdapter


gsm = getGlobalSiteManager()


class BaseAdapter(object):
    """
    Base for all Adapters
    """
    implements(IBaseAdapter)

    def __init__(self, obj):
        """
        Gets an Object to be adapted
        """
        self.obj = obj


class BaseComponent(object):
    """
    """

    def __init__(self, parent):
        self.parent = parent


class TickLabelAdapter(BaseAdapter):
    """
    Generates Ticklabels for an axis
    """
    implementsOnly(ITickLabelAdapter)
    adapts(IAxis)

    def __init__(self, axis):
        """
        Gets an Object to be adapted
        """
        self.axis = axis

    def render(self):
        return map(str, range(self.axis.start, self.axis.end))

gsm.registerAdapter(TickLabelAdapter)


class Axis(BaseComponent):
    """
    Represents an axis
    """

    implements(IAxis)
    adapts(Interface)

    def __init__(self, parent, orientation=None, start=None, end=None):
        super(Axis, self).__init__(parent)
        self.orientation = orientation
        self.start = start
        self.end = end

    def get_tick_labels(self):
        return ITickLabelAdapter(self).render()

    def render(self):
        return 'axis: ' + self.orientation + ':' + ' '.join(self.get_tick_labels())

gsm.registerAdapter(Axis)


class ViewBox(BaseComponent):
    """
    Drawing area of a plot. THe drawing ares may have an unlimited number of axis
    """
    implements(IViewBox)
    adapts(Interface)


    def __init__(self, parent):
        super(ViewBox, self).__init__(parent)
        self.items = []

    def addItem(self, item):
        self.items.append(item)

    def render(self):
        result = []
        for item in self.items:
            result.append(item.render())

        return '\n'.join(result)

gsm.registerAdapter(ViewBox)


class Image(BaseComponent):
    """
    A image representing f(x,y) values
    """
    implements(IImage)
    adapts(Interface)


    def __init__(self, parent, data):
        super(Image, self).__init__(parent)
        self.data = data

    def render(self):
        return 'Image: Rendered image'

gsm.registerAdapter(Image)
