from gevent import monkey
monkey.patch_all()

import sys
import os
import optparse
import logging
from djrandom import daemonize
from djrandom import utils
from djrandom.database import init_db
from djrandom.frontend import app, svcs
from djrandom.frontend.mailer import Mailer
from djrandom.frontend.search import Searcher
from djrandom.model.markov import MarkovModel
from djrandom.model.external import AlbumImageRetriever
from werkzeug.contrib.cache import SimpleCache, MemcachedCache
from gevent.wsgi import WSGIServer

log = logging.getLogger(__name__)


def run_frontend(opts):
    init_db(opts.db_url, opts.solr_url)

    svcs['searcher'] = Searcher(opts.solr_url)
    svcs['album_images'] = AlbumImageRetriever(
        opts.lastfm_api_key, opts.album_art_dir)
    svcs['mailer'] = Mailer(opts.email_sender)
    if opts.memcached_url:
        svcs['cache'] = MemcachedCache([opts.memcached_url])
    else:
        svcs['cache'] = SimpleCache()
    svcs['markov'] = MarkovModel()
    try:
        svcs['markov'].load(opts.markov_data)
    except IOError, e:
        log.error('Could not read Markov data from %s: %s' % (
                opts.markov_data, str(e)))

    # Start the WSGI profiling middleware, if requested.
    if opts.profile:
        from djrandom.frontend.latency import LatencyProfilerMiddleware
        app.wsgi_app = LatencyProfilerMiddleware(
            app.wsgi_app,
            ['/json/album', '/json/song', '/album_image',
             '/json/playlist/get', '/json/playlist/by_title',
             '/json/playlist/list', '/user/activate', '/dl'])

        from repoze.profile.profiler import AccumulatingProfileMiddleware
        app.wsgi_app = AccumulatingProfileMiddleware(
            app.wsgi_app,
            log_filename='/var/tmp/djrandom-profile.log',
            cachegrind_filename='/var/tmp/djrandom-profile.cachegrind',
            discard_first_request=True,
            flush_at_shutdown=True,
            path='/__profile__'
            )

    # Set some configuration options in the Flask global config.
    app.config.from_pyfile(opts.app_config, silent=True)

    http_server = WSGIServer((opts.bind_address, opts.port), app)
    http_server.serve_forever()


def main():
    parser = optparse.OptionParser()
    parser.add_option('--solr_url', default='http://localhost:8080/solr')
    parser.add_option('--bind_address', default='127.0.0.1')
    parser.add_option('--port', type='int', default=3003)
    parser.add_option('--db_url')
    parser.add_option('--lastfm_api_key')
    parser.add_option('--email_sender', default='djrandom@localhost')
    parser.add_option('--album_art_dir', default='/var/tmp/album-image-cache')
    parser.add_option('--markov_data',
                      default='/var/lib/djrandom/djrandom-markov.dat')
    parser.add_option('--memcached_url')
    parser.add_option('--profile', action='store_true')
    parser.add_option('--app_config')
    daemonize.add_standard_options(parser)
    utils.read_config_defaults(
        parser, os.getenv('DJRANDOM_CONF', '/etc/djrandom.conf'))
    opts, args = parser.parse_args()
    if not opts.db_url:
        parser.error('Must provide --db_url')
    if not opts.app_config:
        parser.error('Must provide --app_config')
    if args:
        parser.error('Too many arguments')

    daemonize.daemonize(opts, run_frontend, (opts,),
                        support_gevent=True)


if __name__ == '__main__':
    main()