##############################################################################
#
# Copyright (c) 2004 Nexedi SARL and Contributors. All Rights Reserved.
#                    Sebastien Robin <seb@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
##############################################################################

from AccessControl import ClassSecurityInfo
from Globals import InitializeClass, DTMLFile, PersistentMapping
from Products.ERP5Type.Document.Folder import Folder
from Products.ERP5Type.Tool.BaseTool import BaseTool
from Products.ERP5Type import Permissions
from Products.ERP5 import _dtmldir
from Products.ERP5.ERP5Globals import alarm_type_list
from Products.CMFCore import CMFCorePermissions
from DateTime import DateTime


from zLOG import LOG

class AlarmTool(BaseTool):
  """
  This tool will be usefull to  manage alarms. There's
  alarms everywhere in ERP5, and it is a nice idea to be able
  to manage all of them from a central point.

  Inside this tool we will have a way to retrieve all reports comings
  from Alarms,...
  """
  id = 'portal_alarms'
  meta_type = 'ERP5 Alarm Tool'
  portal_type = 'Alarm Tool'
  allowed_types = ('Supply Alarm Line',)

  # Declarative Security
  security = ClassSecurityInfo()

  security.declareProtected( Permissions.ManagePortal, 'manage_overview' )
  manage_overview = DTMLFile( 'explainAlarmTool', _dtmldir )

  security.declareProtected( Permissions.ManagePortal , 'manageAlarmList' )
  manageAlarmList = DTMLFile( 'manageAlarmList', _dtmldir )

  manage_options = ( ( { 'label'   : 'Overview'
             , 'action'   : 'manage_overview'
             }
            , { 'label'   : 'All Alarms'
             , 'action'   : 'manageAlarmList'
             }
            )
           + Folder.manage_options
           )



  # API to manage alarms
  """
  This is what we should do:

  -- be able to see all alarms stored everywhere
  -- defines global alarms
  -- activate an alarm
  -- see reports
  -- see active alarms
  -- retrieve all alarms
  """

  security.declareProtected(Permissions.ModifyPortalContent, 'getAlarmList')
  def getAlarmList(self):
    """
    We retrieve thanks to the catalog the full list of alarms
    """
    catalog_search = self.portal_catalog(portal_type = alarm_type_list)
    alarm_list = map(lambda x:x.getObject(),catalog_search)
    return alarm_list

  security.declareProtected(Permissions.ModifyPortalContent, 'tic')
  def tic(self):
    """
    We will look at all alarms and see if they should be activated,
    if so then we will activate them.
    """
    current_date = DateTime()
    for alarm in self.getAlarmList():
      if alarm.isActive(): # do nothing if already active
        continue
      if alarm.getNextStartDate() <= current_date:
        alarm.activeSense()









#    security.declareProtected(Permissions.AccessContentsInformation, 'manageActiveSense')
#    def manageActiveSense(self, object_path, REQUEST=None):
#      """
#        Invokes all methods for object "object_path"
#      """
#      if type(object_path) is type(''):
#        object_path = tuple(object_path.split('/'))
#      object = self.unrestrictedTraverse(object_path)
#      object.activeSense()
#      if REQUEST is not None:
#        return REQUEST.RESPONSE.redirect('%s/%s' % (self.absolute_url(), 'manageAlarmList'))
#
#    security.declareProtected(Permissions.AccessContentsInformation, 'manageSolve')
#    def manageSolve(self, object_path, REQUEST=None):
#      """
#        Invokes all methods for object "object_path"
#      """
#      if type(object_path) is type(''):
#        object_path = tuple(object_path.split('/'))
#      object = self.unrestrictedTraverse(object_path)
#      object.solve()
#      if REQUEST is not None:
#        return REQUEST.RESPONSE.redirect('%s/%s' % (self.absolute_url(), 'manageAlarmList'))
#





InitializeClass(AlarmTool)