try:
    from flask import (Flask, Response, abort,
                       jsonify as flask_jsonify,
                       redirect, render_template,
                       request, session, url_for)
    from flask_wtf.csrf import CSRFProtect
    from flask import jsonify
except:
    pass # flask not available

from .base import Manager, wrap_function, app

class FlaskManager(Manager):
    """
    """
    def render_json(self, obj):
        return jsonify(obj) # has correct header type set

    def get_argument(self, name, default_value=None):
        return request.args.get(name, default_value)

    def render_template(self, template_name, **kwargs):
        values = {}
        for f in app.get_context_processors():
            values.update(f(self))
        values.update(kwargs)
        return render_template(template_name, **values)

    def error(self, error_number):
        return self.render_template("%s.html" % error_number), error_number

    def redirect(self, url):
        return redirect(url)

    def url_for(self, name):
        return url_for(name)

    @property
    def request(self):
        return request

    def run(self):
        self.app = Flask(__name__,
                         template_folder=self.get_template_folder(),
                         static_folder=self.get_static_folder())
        self.app.config.update(WTF_CSRF_CHECK_DEFAULT=False)
        self.app.config["CSS"] = self.CSS
        self.app.config.update(self.config)
        self.csrf = CSRFProtect(self.app)
        ## Add routes:
        for path, methods, f, kwargs in app._data.routes:
            ## Add the route:
            self.app.route(path, methods=methods, **kwargs)(wrap_function(self, f))
        ## Add filters:
        for f in app._data.filters:
            ## Add the template filter function:
            self.app.template_filter()(wrap_function(self, f))
        self.app.run(debug=1, port=self.port)

    def load_secret_key(self, name):
        key = self._load_secret_key(name)
        self.app.secret_key = key

    def after_request(self, f):
        """
        Decorator
        """
        return self.app.after_request(f)

    def template_filter(self):
        """
        Decorator
        """
        def decorator(f):
            self.app.template_filter()(f)
        return decorator

    def login_required(self, f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not session.get("logged_in"):
                return redirect(url_for("login", next=request.url))
            return f(*args, **kwargs)
        return decorated_function