import datetime
import os

from flask import Flask, Blueprint, render_template
from flask_cors import CORS

from app.controller import home, sms, email, shorturl
from app.utils import log_util, auth
from app.utils.constant import Constant

ip_whitelist = ["127.0.0.1","101.132.116.174"]


def create_app():
    app = Flask("app")
    CORS(app, resources={r'/*': {'origins': '*'}})
    register_logging(app)
    register_session(app)
    configure_app(app)
    register_hooks(app)
    register_blueprints(app)
    return app


def configure_app(app):
    app.url_map.strict_slashes = False


def register_session(app):
    app.config['SECRET_KEY'] = os.urandom(16)

    app.config['REMEMBER_COOKIE_NAME'] = "SPIN_REMEMBER_COOKIE"
    app.config['REMEMBER_COOKIE_DURATION'] = datetime.timedelta(hours=3.0)
    auth.init_app(app)


def register_logging(app):
    log_util.register_logging(app)
    # log_dir = os.path.join(os.path.dirname(__file__), "logs")
    # os.makedirs(log_dir, exist_ok=True)
    # # access log
    # logger = logging.getLogger('werkzeug')
    # logger.handlers.clear()
    # logger.propagate = False
    # handler = logging.FileHandler(os.path.join(log_dir, "access.log"))
    # logger.addHandler(handler)


def register_blueprints(app):
    static = Blueprint('static', 'static', static_folder=os.path.join(app.root_path, "static"))
    app.register_blueprint(static, url_prefix=Constant.APP_CONTEXT_PATH)
    app.register_blueprint(home.mod, url_prefix=Constant.APP_CONTEXT_PATH)
    app.register_blueprint(sms.mod, url_prefix='{}/sms'.format(Constant.APP_CONTEXT_PATH))
    app.register_blueprint(email.mod, url_prefix='{}/email'.format(Constant.APP_CONTEXT_PATH))
    app.register_blueprint(shorturl.mod, url_prefix='{}/shorturl'.format(Constant.APP_CONTEXT_PATH))


def register_hooks(app):
    @app.before_request
    def before_request():
        pass
        # 弃用
        # if len(ip_whitelist) > 0:
        #     ip = request.remote_addr
        #     if ip not in ip_whitelist:
        #         return json.dumps({"code": 403, "message": "{} not allow access".format(ip)})
        # session["app_ctx"] = Constant.APP_CONTEXT_PATH

    @app.errorhandler(400)
    def err_400(e):
        return render_template('error_page/400.html', message=e.description), 400

    @app.errorhandler(403)
    def err_403(e):
        return render_template('error_page/403.html', message=e.description), 403

    @app.errorhandler(404)
    def err_404(e):
        return render_template('error_page/404.html', message=e.description), 404

    @app.errorhandler(500)
    def err_500(e):
        return render_template('error_page/500.html', message=e.description), 500


if __name__ == "__main__":
    flask_app = create_app()
    flask_app.run(host="0.0.0.0", port=5000, debug=False)
