# Copyright (C) 2009 Google Inc. All rights reserved.
# Copyright (C) 2014 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Request a modern Django
from google.appengine.dist import use_library
use_library('django', '1.2')  # Must agree with __init.py__

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

from handlers.activebots import ActiveBots
from handlers.gc import GC
from handlers.nextpatch import NextPatch
from handlers.patch import Patch
from handlers.patchstatus import PatchStatus
from handlers.processingtimesjson import ProcessingTimesJSON
from handlers.queuecharts import QueueCharts
from handlers.queuelengthjson import QueueLengthJSON
from handlers.queuestatus import QueueStatus
from handlers.queuestatusjson import QueueStatusJSON
from handlers.recentstatus import QueuesOverview
from handlers.releasepatch import ReleasePatch
from handlers.releaselock import ReleaseLock
from handlers.showresults import ShowResults
from handlers.statusbubble import StatusBubble
from handlers.submittoews import SubmitToEWS
from handlers.svnrevision import SVNRevision
from handlers.syncqueuelogs import SyncQueueLogs
from handlers.updatestatus import UpdateStatus
from handlers.updatesvnrevision import UpdateSVNRevision
from handlers.updateworkitems import UpdateWorkItems


webapp.template.register_template_library('filters.webkit_extras')

routes = [
    ('/', QueuesOverview),
    ('/gc', GC),
    ('/sync-queue-logs', SyncQueueLogs),
    (r'/patch-status/(.*)/(.*)', PatchStatus),
    (r'/patch/(.*)', Patch),
    ('/submit-to-ews', SubmitToEWS),
    (r'/results/(.*)', ShowResults),
    (r'/status-bubble/(.*)', StatusBubble),
    (r'/svn-revision/(.*)', SVNRevision),
    (r'/queue-charts/(.*)', QueueCharts),
    (r'/queue-length-json/(.*)', QueueLengthJSON),
    (r'/queue-status/(.*)/bots/(.*)', QueueStatus),
    (r'/queue-status/(.*)', QueueStatus),
    (r'/queue-status-json/(.*)', QueueStatusJSON),
    (r'/next-patch/(.*)', NextPatch),
    ('/release-patch', ReleasePatch),
    ('/release-lock', ReleaseLock),
    ('/update-status', UpdateStatus),
    ('/update-work-items', UpdateWorkItems),
    ('/update-svn-revision', UpdateSVNRevision),
    ('/active-bots', ActiveBots),
    (r'/processing-times-json/(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)\-(\d+)', ProcessingTimesJSON),
]

application = webapp.WSGIApplication(routes, debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()
