#!/usr/bin/env python
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

import logging
from datetime import datetime
from subprocess import Popen
import textwrap

from flask.ext.migrate import MigrateCommand
from flask.ext.script import Manager

import caravel
from caravel import app, ascii_art, db, data, utils

config = app.config

manager = Manager(app)
manager.add_command('db', MigrateCommand)


@manager.option(
    '-d', '--debug', action='store_true',
    help="Start the web server in debug mode")
@manager.option(
    '-p', '--port', default=config.get("CARAVEL_WEBSERVER_PORT"),
    help="Specify the port on which to run the web server")
@manager.option(
    '-w', '--workers', default=config.get("CARAVEL_WORKERS", 16),
    help="Number of gunicorn web server workers to fire up")
@manager.option(
    '-t', '--timeout', default=config.get("CARAVEL_WEBSERVER_TIMEOUT"),
    help="Specify the timeout (seconds) for the gunicorn web server")
def runserver(debug, port, timeout, workers):
    """Starts a Caravel web server"""
    debug = debug or config.get("DEBUG")
    if debug:
        app.run(
            host='0.0.0.0',
            port=int(port),
            debug=True)
    else:
        cmd = (
            "gunicorn "
            "-w {workers} "
            "--timeout {timeout} "
            "-b 0.0.0.0:{port} "
            "caravel:app").format(**locals())
        print("Starting server with command: " + cmd)
        Popen(cmd, shell=True).wait()

@manager.command
def init():
    """Inits the Caravel application"""
    utils.init(caravel)

@manager.command
def version():
    """Prints the current version number"""
    s = (
        "\n{boat}\n\n"
        "-----------------------\n"
        "Caravel {version}\n"
        "-----------------------\n").format(
        boat=ascii_art.boat, version=caravel.VERSION)
    print(s)

@manager.option(
    '-s', '--sample', action='store_true',
    help="Only load 1000 rows (faster, used for testing)")
def load_examples(sample):
    """Loads a set of Slices and Dashboards and a supporting dataset """
    print("Loading examples into {}".format(db))

    data.load_css_templates()

    print("Loading energy related dataset")
    data.load_energy()

    print("Loading [World Bank's Health Nutrition and Population Stats]")
    data.load_world_bank_health_n_pop()

    print("Loading [Birth names]")
    data.load_birth_names()

@manager.command
def refresh_druid():
    """Refresh all druid datasources"""
    session = db.session()
    from caravel import models
    for cluster in session.query(models.DruidCluster).all():
        try:
            cluster.refresh_datasources()
        except Exception as e:
            print(
                "Error while processing cluster '{}'\n{}".format(
                    cluster, str(e)))
            logging.exception(e)
        cluster.metadata_last_refreshed = datetime.now()
        print(
            "Refreshed metadata from cluster "
            "[" + cluster.cluster_name + "]")
    session.commit()


if __name__ == "__main__":
    manager.run()
