#!/usr/bin/env python

# Copyright (C) 2012-2013 Science and Technology Facilities Council.
#
# 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 3 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, see <http://www.gnu.org/licenses/>.

import cherrypy

from crab.notify import CrabNotify
from crab.service.monitor import CrabMonitor
from crab.service.notify import CrabNotifyService
# crab.web.rss imports the optional PyRSS2Gen requirement
try:
    from crab.web.rss import CrabRSS
except ImportError:
    CrabRSS = None
from crab.server import CrabServer
from crab.server.config import read_crabd_config, construct_store
from crab.util.filter import CrabEventFilter
from crab.web.web import CrabWeb

def main():
    config = read_crabd_config()

    if 'outputstore' in config:
        outputstore = construct_store(config['outputstore'])
    else:
        outputstore = None

    store = construct_store(config['store'], outputstore)

    # Set a default timezone: applies to times shown in
    # notifications and on the web interface.
    CrabEventFilter.set_default_timezone(config['notify']['timezone'])

    monitor = CrabMonitor(store)
    monitor.daemon = True
    monitor.start()

    # Pass whole configuration to CrabNotify to allow it to
    # construct notification method objects.
    notifier = CrabNotify(config, store)

    notify = CrabNotifyService(config['notify'], store, notifier)
    notify.daemon = True
    notify.start()

    cherrypy.config.update(config)

    cherrypy.tree.mount(
        CrabWeb(store, monitor,
                config['crab']['home'],
                {
                    'Monitor' : monitor,
                    'Notification' : notify,
                },
                {
                    'rss_enabled': (CrabRSS is not None),
                }),
         '/', config)

    cherrypy.tree.mount(CrabServer(store), '/api/0', {})

    if CrabRSS is not None:
        cherrypy.tree.mount(
            CrabRSS(store, config['crab']['base_url']),
            '/rss', {})

    cherrypy.engine.start()
    cherrypy.engine.block()

if __name__ == "__main__":
    main()
