#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author         : Tom.Lee
# @File           : tools.py
# @Product        : PyCharm
# @Docs           : main
# @Source         :
from flask import Flask, Blueprint
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy

import config
from . import common
from . import extends
from . import plugins

logger = common.ConsoleLogger('flask')

app = Flask(__name__)
app.static_folder = config.STATIC_FOLDER
app.template_folder = config.TEMPLATE_FOLDER
app.secret_key = '1!@#$%^&*()'
app.config.from_object(config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)


def __register_blueprint_models():
    # 注册模块信息
    try:
        from .views import BLUEPRINT_MODELS
        if not isinstance(BLUEPRINT_MODELS, (tuple, list, set)):
            raise AssertionError('BLUEPRINT_MODELS must be (tuple, list, set) type.')
    except (ImportError, AssertionError, Exception) as e:
        logger.warning('register blueprint fail, {}'.format(e))
        return

    for model in BLUEPRINT_MODELS:
        if not isinstance(model, Blueprint):
            logger.error('Register Blueprint {} model fail, '
                         'The model type must be flask.Blueprint.'.format(model))
            continue
        try:
            app.register_blueprint(model)
            logger.info('register blueprint {} success.'.format(model.name))
        except Exception as e:
            logger.error('register blueprint {} error, {}.'.format(model.name, e))


def __init_tables():
    db.create_all()


def __flask_extends():
    setattr(Flask, 'make_celery', plugins.make_celery)
    plugins.celery = app.make_celery()


__flask_extends()
__register_blueprint_models()
__init_tables()
logger.debug("urls: ")
for i in list(set([url.rule for url in app.url_map.iter_rules()])):
    logger.debug(i)