#!/usr/bin/env python2.5
#
# Copyright 2008 the Melange authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Main Melange module with profiling support.
"""

__authors__ = [
  # alphabetical order by last name, please
  '"Augie Fackler" <durin42@gmail.com>',
  '"Pawel Solyga" <pawel.solyga@gmail.com>',
  ]


import logging

from google.appengine.ext.webapp import util

# pylint: disable-msg=W0611
import gae_django


def profile_main_as_html():
  """Main program for profiling. Profiling data added as HTML to the page.
  """
  import cProfile
  import pstats
  import StringIO

  prof = cProfile.Profile()
  prof = prof.runctx('real_main()', globals(), locals())
  stream = StringIO.StringIO()
  stats = pstats.Stats(prof, stream=stream)
  # stats.strip_dirs()  # Don't; too many modules are named __init__.py.
  
  # 'time', 'cumulative' or 'calls'
  stats.sort_stats('time')  
  
  # Optional arg: how many to print
  stats.print_stats() 
  # The rest is optional.
  # stats.print_callees()
  # stats.print_callers()
  print '\n<hr>'
  print '<h1>Profile data</h1>'
  print '<pre>'
  print stream.getvalue()[:1000000]
  print '</pre>'


def profile_main_as_logs():
  """Main program for profiling. Profiling data logged.
  """
  import cProfile
  import pstats
  import StringIO
  
  prof = cProfile.Profile()
  prof = prof.runctx("real_main()", globals(), locals())
  stream = StringIO.StringIO()
  stats = pstats.Stats(prof, stream=stream)
  stats.sort_stats('time')  # Or cumulative
  stats.print_stats(80)  # 80 = how many to print
  # The rest is optional.
  # stats.print_callees()
  # stats.print_callers()
  logging.info("Profile data:\n%s", stream.getvalue())


def real_main():
  """Main program without profiling.
  """
  import django.core.handlers.wsgi

  # Create a Django application for WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()

  from soc.modules import callback
  from soc.modules import core

  callback.registerCore(core.Core())
  callback.getCore().registerModuleCallbacks()

  # Run the WSGI CGI handler with that application.
  util.run_wsgi_app(application)

main = real_main

if __name__ == '__main__':
  main()
