from flask import request, g
import jwt
import logging
import bugsnag

from auth_middleware import AuthMiddleware
from response_templates.response_builders import auth_failure_response


class EMICheckoutMiddleware:

    @classmethod
    def main(cls, func):
        def wrapper(*args, **kwargs):
            try:
                if 'HTTP_AUTHORIZATION' in request.environ:
                    token = request.environ['HTTP_AUTHORIZATION'].replace('Bearer ', '')
                    token_data = cls.jwt_decode(token)
                    user_id = token_data.get('id')
                    vendor_id = token_data.get('vendor_id')
                    request_valid = AuthMiddleware('Database').main(user_id, vendor_id)
                else:
                    logging.info("Request IP: " + request.remote_addr)
                    request_valid = AuthMiddleware('Database').main()
                if request_valid:
                    if 'HTTP_AUTHORIZATION' in request.environ or 'HTTP_X_CLIENT_ID' in request.environ:
                        request.environ['vendor_id'] = getattr(g, 'auth', None)['vendor_id']
                    return func(*args, **kwargs)
                else:
                    return auth_failure_response(code='CF10401', )
            except Exception as ex:
                bugsnag.notify(ex)
                return auth_failure_response(code='CF11401', )

        return wrapper

    @staticmethod
    def jwt_decode(token, ):
        payload = jwt.decode(token, options={"verify_signature": False})
        return payload

