import jwt
from flask_restful import Resource
import globals
import datetime
import bcrypt
from webargs.flaskparser import use_args, parser, abort
from webargs import fields

userDB = globals.userDB


def verify(token):
    try:
        return jwt.decode(token, globals.JWT_SECRET, "HS256")
    except:
        return False


class Login(Resource):
    login_args = {"username": fields.Str(required=True), "password": fields.Str(required=True)}

    @use_args(login_args)
    def post(self, args):
        try:
            user = userDB.find_one({"userName": args["username"]})
            if user:
                passW = user["password"].encode()
                if bcrypt.checkpw(args["password"].encode(), passW):
                    jwToken = jwt.encode({
                        "exp": datetime.datetime.now().astimezone() + datetime.timedelta(hours=12),
                        "id": str(user.get("_id"))},
                        globals.JWT_SECRET)

                    return {"Token": jwToken}, 200
                else:
                    return str("Username/password Invalid"), 401
            else:
                return str("Username/password Invalid"), 401
        except:
            return "There was an error", 404


# This error handler is necessary for usage with Flask-RESTful
@parser.error_handler
def handle_request_parsing_error(err, req, schema, *, error_status_code, error_headers):
    """webargs error handler that uses Flask-RESTful's abort function to return
    a JSON error response to the client.
    """
    if not error_status_code:
        abort(400, errors=err.messages)
    else:
        abort(error_status_code, errors=err.messages)

