"""
    flaskbb.manage
    ~~~~~~~~~~~~~~~~~~~~

    This script provides some easy to use commands for
    creating the database with or without some sample content.
    You can also run the development server with it.
    Just type `python manage.py` to see the full list of commands.

    :copyright: (c) 2014 by the FlaskBB Team.
    :license: BSD, see LICENSE for more details.
"""
from flask import current_app
from flask.ext.script import Manager, Shell, Server, prompt, prompt_pass
from flask.ext.migrate import MigrateCommand

from flaskbb import create_app
from flaskbb.extensions import db
from flaskbb.utils.populate import (create_test_data, create_welcome_forum,
                                    create_admin_user, create_default_groups)

# Use the development configuration if available
try:
    from flaskbb.configs.development import DevelopmentConfig as Config
except ImportError:
    from flaskbb.configs.default import DefaultConfig as Config

app = create_app(Config)
manager = Manager(app)

# Run local server
manager.add_command("runserver", Server("localhost", port=8080))

# Migration commands
manager.add_command('db', MigrateCommand)


# Add interactive project shell
def make_shell_context():
    return dict(app=current_app, db=db)
manager.add_command("shell", Shell(make_context=make_shell_context))


@manager.command
def initdb():
    """Creates the database."""

    db.create_all()


@manager.command
def dropdb():
    """Deletes the database"""

    db.drop_all()


@manager.command
def createall():
    """Creates the database with some testing content."""

    # Just for testing purposes
    db.drop_all()

    db.create_all()
    create_test_data()


@manager.option('-u', '--username', dest='username')
@manager.option('-p', '--password', dest='password')
@manager.option('-e', '--email', dest='email')
def create_admin(username, password, email):
    """Creates the admin user"""

    username = prompt("Username")
    email = prompt("A valid email address")
    password = prompt_pass("Password")

    create_admin_user(username, email, password)


@manager.option('-u', '--username', dest='username')
@manager.option('-p', '--password', dest='password')
@manager.option('-e', '--email', dest='email')
@manager.option('-d', '--dropdb', dest='dropdb', default=False)
def initflaskbb(username, password, email, dropdb=False):
    """Initializes FlaskBB with all necessary data"""

    if dropdb:
        app.logger.info("Dropping previous database...")
        db.drop_all()

    app.logger.info("Creating tables...")
    db.create_all()

    app.logger.info("Creating default groups...")
    create_default_groups()

    app.logger.info("Creating admin user...")
    create_admin(username, password, email)

    app.logger.info("Creating welcome forum...")
    create_welcome_forum()

    app.logger.info("Congratulations! FlaskBB has been successfully installed")


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