#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import random

from flask import current_app
from flask import render_template_string
import flask_script
from flask_script.commands import ShowUrls

import xpin
from xpin.app.extensions import db
from xpin.app.models import AdminUser
from xpin.app.app import create_app

manager = flask_script.Manager(create_app)
manager.add_option('-c', '--config', dest='config', required=True)


manager.add_command('urls', ShowUrls())


@manager.command
def syncdb():
    """
    Create tables
    """
    db.create_all()


@manager.option('-r', '--roles', dest='roles', action='append', default=[])
@manager.option(dest='password')
@manager.option(dest='username')
def addadmin(username, password, roles):
    """
    Add admin user
    """
    if AdminUser.query.filter_by(username=username).first():
        print 'duplicate username: %s' % username
        return

    admin_user = AdminUser(username=username)
    admin_user.set_password(password)
    admin_user.roles = roles

    db.session.add(admin_user)
    db.session.commit()


@manager.command
def dbshell():
    """
    Like Django's dbshell，with flask-sqlalchemy
    """
    SQLALCHEMY_DATABASE_URI = current_app.config['SQLALCHEMY_DATABASE_URI']
    if not SQLALCHEMY_DATABASE_URI:
        print 'no SQLALCHEMY_DATABASE_URI'
        return

    if SQLALCHEMY_DATABASE_URI.startswith('sqlite:'):
        db_path = SQLALCHEMY_DATABASE_URI.replace('sqlite:///', '')
        cmd = 'sqlite3 %s' % db_path
    elif SQLALCHEMY_DATABASE_URI.startswith('mysql:'):
        params = SQLALCHEMY_DATABASE_URI.split('/')
        dbname = params[-1]
        user_pass_part, host_port_part = params[-2].split('@')
        if user_pass_part.find(':') >= 0:
            user, password = user_pass_part.split(':')
        else:
            user, password = user_pass_part, ''

        if host_port_part.find(':') >= 0:
            host, port = host_port_part.split(':')
        else:
            host, port = host_port_part, ''

        cmd = render_template_string(
            'mysql -u{{user}} {% if password %}-p{{password}}{% endif %} {% if host %}-h{{host}}{% endif %} {% if port %}-P{{port}}{% endif %} -D{{dbname}}',
            user=user, password=password, host=host, port=port, dbname=dbname
        )

    else:
        print '\033[1;33m%s\033[0m' % 'only support mysql, sqlite'
        return

    print '\033[1;32m%s\033[0m' % cmd
    os.system(cmd)


@manager.option(dest='length', type=int)
def genkey(length):
    """
    generate secret key，参考django
    """
    chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
    print ''.join([random.choice(chars) for i in range(length)])


@manager.command
def version():
    """
    版本
    """
    print xpin.__version__


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

