import { Token } from "@prisma/client"
import jwt from "jsonwebtoken"
import jwtVerifyCatch from "../jwtVerifyCatch"

async function checkTokenIsValid<T>(
  payload: T & { token: string; tokenType: Token["type"] }
) {
  const { token, tokenType } = payload

  // Verify the token and get the payload
  let tokenData: string | jwt.JwtPayload
  try {
    tokenData = jwt.verify(token, process.env.ACCESS_TOKEN_SECRET as string)
  } catch (err: any) {
    // Deal with the problem in more detail
    return Promise.reject(jwtVerifyCatch(tokenType, err))
  }
  // Making sure the token data is not a string (because it should be an object)
  if (typeof tokenData === "string") {
    return Promise.reject({
      message: tokenType + "-Token data was a string. Token: " + token,
      statusCode: 401,
      solved: false,
    })
  }

  return { ...payload, tokenBody: token, tokenIsValid: true }
}

export default checkTokenIsValid
