# -*- coding: UTF-8 -*-
# -*- Mode: Python; py-indent-offset: 4 -*-
# Authors: Nik Kim <fafhrd@legco.biz> 
__version__ = '$Revision: 1.3 $'[11:-2]

import sys, time
from DateTime import DateTime
from Globals import InitializeClass
from OFS.SimpleItem import SimpleItem
from OFS.PropertyManager import PropertyManager

from zLOG import LOG, INFO, ERROR

from AccessControl import ClassSecurityInfo, Permissions
from Products.PageTemplates.PageTemplateFile import PageTemplateFile

current_version = 1

class TimerService(SimpleItem):
    """ timer service, all objects that wants timer
    event subscribe here """

    id='timer_service'
    title = 'TimerService'

    security = ClassSecurityInfo()

    icon = 'misc_/TimerService/timer_icon.gif'

    max_size = 0
    
    manage_options = (
        ({'label': 'Subscribers', 'action':'manage_viewSubscriptions'},))

    security.declareProtected(
        Permissions.view_management_screens, 'manage_viewSubscriptions')
    manage_viewSubscriptions = PageTemplateFile(
        'zpt/view_subscriptions',
        globals(),
        __name__='manage_viewSubscriptions'
        )
    
    _version = 0
    
    def __init__(self, id='timer_service'):
        """ """
        self._subscribers = []
        self._version = 1

    def process_timer(self, interval):
        """ """
        subscriptions = [self.unrestrictedTraverse(path)
                         for path in self._subscribers]

        tick = time.time()
        prev_tick = tick - interval
        next_tick = tick + interval

        LOG('TimerService', INFO, 'Ttimer tick at %s\n'%time.ctime(tick))

        for subscriber in subscriptions:
            try:
                subscriber.process_timer(
                    interval, DateTime(tick), DateTime(prev_tick), DateTime(next_tick))
            except:
                LOG('TimerService', ERROR, 'Process timer error', error = sys.exc_info())

    def subscribe(self, ob):
        """ """
        path = '/'.join(ob.getPhysicalPath())

        #if not ISMTPHandler.isImplementedBy(ob):
        #    raise ValueError, 'Object not support ISMTPHandler'

        subscribers = self._subscribers
        if path not in subscribers:
            subscribers.append(path)
            self._subscribers = subscribers

    def unsubscribe(self, ob):
        """ """
        path = '/'.join(ob.getPhysicalPath())

        subscribers = self._subscribers
        if path in subscribers:
            subscribers.remove(path)
            self._subscribers = subscribers
    
    security.declareProtected(
        Permissions.view_management_screens, 'lisSubscriptions')
    def lisSubscriptions(self):
        """ """
        return self._subscribers

    def manage_removeSubscriptions(self, no, REQUEST=None):
        """ """
        subs = self.listAllSubscriptions()

        remove_list = [subs[n] for n in [int(n) for n in no]]

        for subs, event, fl in remove_list:
            self.unsubscribe( subs, event_type=event )

        if REQUEST is not None:
            REQUEST.RESPONSE.redirect('manage_viewSubscriptions')


InitializeClass(TimerService)