#!/usr/bin/env python
# -*- coding=UTF-8 -*-
# **************************************************************************
# Copyright © 2016 jianglin
# File Name: __init__.py
# Author: jianglin
# Email: xiyang0807@gmail.com
# Created: 2016-05-20 12:35:52 (CST)
# Last Update:星期五 2016-7-29 12:33:47 (CST)
#          By:jianglin
# Description:
# **************************************************************************
from flask import Flask, g, send_from_directory, request
from maple.extensions import (register_login, register_redis, register_mail,
                              register_cache)
from maple.extensions import (register_form, register_babel,
                              register_principal, register_jinja2,
                              register_avatar, register_maple)
from maple.extensions import register_rbac
from flask_login import current_user
from flask_sqlalchemy import SQLAlchemy
from .logs import register_logging
import os


def create_app():
    templates = os.path.abspath(os.path.join(
        os.path.dirname(__file__), os.pardir, 'templates'))
    static = os.path.abspath(os.path.join(
        os.path.dirname(__file__), os.pardir, 'static'))

    app = Flask(__name__, template_folder=templates, static_folder=static)
    app.config.from_object('config.config')
    app.url_map._rules.clear()
    app.url_map._rules_by_endpoint.clear()
    app.url_map.default_subdomain = 'forums'
    app.add_url_rule(app.static_url_path + '/<path:filename>',
                     endpoint='static',
                     view_func=app.send_static_file,
                     subdomain='forums')
    return app


def register(app):
    register_avatar(app)
    register_babel(app)
    register_form(app)
    register_principal(app)
    register_jinja2(app)
    register_maple(app)
    register_routes(app)
    register_logging(app)


def register_routes(app):
    from .urls import register_urls
    register_urls(app)


app = create_app()
db = SQLAlchemy(app)
mail = register_mail(app)
login_manager = register_login(app)
redis_data = register_redis(app)
cache = register_cache(app)
rbac = register_rbac(app)
register(app)


@app.before_request
def before_request():
    from maple.forums.forms import SortForm, SearchForm
    g.user = current_user
    g.sort_form = SortForm()
    g.search_form = SearchForm()
    from maple.main.records import mark_online
    mark_online(request.remote_addr)


@app.route('/robots.txt')
@app.route('/favicon.ico')
def static_from_root():
    return send_from_directory(app.static_folder, request.path[1:])