from flask import Flask, Blueprint, current_app, jsonify, request

from api.security.csrf.constants import CSRF_SECRET_KEY, SALT, CSRF_COOKIE_NAME
from api.security.csrf.csrf import generate_csrf_token, set_csrf_cookie

from api.security.fingerprint import IFingerprintGenerator

csrf_blueprint = Blueprint('csrf', __name__)


@csrf_blueprint.get('/csrf')
def get_and_set_csrf_token():
    csrf_secret_key = current_app.config.get(CSRF_SECRET_KEY)
    csrf_token = generate_csrf_token(csrf_secret_key, SALT)
    resp = jsonify(csrf_token=csrf_token)
    set_csrf_cookie(resp, csrf_token)
    return resp


class CSRF(object):

    def __init__(self, app: Flask = None, fingerprint_generator=None):
        if app is not None and fingerprint_generator is not None:
            self.init_app(app, fingerprint_generator)

    def init_app(self, app, fingerprint_generator: IFingerprintGenerator):
        csrf_secret_key = fingerprint_generator.fingerprint()

        app.config['CSRF_SECRET_KEY'] = csrf_secret_key
        app.register_blueprint(csrf_blueprint)
