##############################################################################
#
# 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.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
           )


  # Factory Type Information
  factory_type_information = \
    {    'id'             : portal_type
       , 'meta_type'      : meta_type
       , 'description'    : """\
TemplateTool manages Business Templates."""
       , 'icon'           : 'folder_icon.gif'
       , 'product'        : 'ERP5Type'
       , 'factory'        : 'addFolder'
       , 'immediate_view' : 'Folder_viewContentList'
       , 'allow_discussion'     : 1
       , 'allowed_content_types': ('Business Template',
                                    )
       , 'filter_content_types' : 1
       , 'global_allow'   : 1
       , 'actions'        :
      ( { 'id'            : 'view'
        , 'name'          : 'View'
        , 'category'      : 'object_view'
        , 'action'        : 'Folder_viewContentList'
        , 'permissions'   : (
            Permissions.View, )
        },
      )
    }

  # 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,to_active=0):
    """
    We retrieve thanks to the catalog the full list of alarms
    """
    if to_active:
      now = str(DateTime())
      date_expression = '<= %s' % now
      catalog_search = self.portal_catalog(portal_type = self.getPortalAlarmTypeList(), alarm_date=date_expression)
      # check again the alarm date in case the alarm was not yet reindexed
      alarm_list = [x.getObject() for x in catalog_search if x.getObject().getAlarmDate()<=now]
    else:
      catalog_search = self.portal_catalog(portal_type = self.getPortalAlarmTypeList())
      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(to_active=1):
      if alarm.isActive() or not alarm.isEnabled(): 
        # do nothing if already active, or not enabled
        continue
      alarm.activate().activeSense()