# -*- coding: utf-8 -*-
from flask import Flask
from config import config
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
from flask_moment import Moment
# 使用 JavaScript 实现的客户端 Markdown 到 HTML 的转换程序 集成到WTF中
from flask_pagedown import PageDown

db = SQLAlchemy()
bootstrap = Bootstrap()
moment = Moment()
pagedown = PageDown()
login_manager = LoginManager()
# session_protection 属性可以设为 None 、 'basic' 或 'strong' 以提供不同的安全等级防止用户会话遭篡改
# 设为 'strong' 时，Flask-Login 会记录客户端 IP地址和浏览器的用户代理信息，如果发现异动就登出用户
login_manager.session_protection = 'strong'
# login_view 属性设置登录页面的端点,登录路由在蓝本中定义，因此要在前面加上蓝本的名字。
login_manager.login_message = u'请先登陆你的账号再进行下一步操作!'
login_manager.login_view = 'auth.login'


def create_app(config_name):
    app = Flask(__name__, instance_relative_config=True)
    # 加载公开配置
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    # 加载个人配置 覆盖公开配置
    app.config.from_pyfile('config.py')

    db.init_app(app)
    bootstrap.init_app(app)
    login_manager.init_app(app)
    pagedown.init_app(app)
    moment.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    from .admin import admin as admin_blueprint
    app.register_blueprint(admin_blueprint)

    return app