import { Request, Response } from "express";
import { JWTHelper } from "../helpers/jwtHelper";
import { JWTToken } from "../type/jwtTypes";
import InternalException from "../exceptions/internalException";
import RefreshCommandHandler from "../command/refreshCommandHandler";
import { CreateRefreshCommand, DeleteRefreshCommand } from "../command/refreshCommand";
import UserService from "../service/user/userService";
import speakeasy from "speakeasy";
import UnauthorizedRequestException from "../exceptions/unauthorizedRequestException";
import RefreshService from "../service/refreshService";
import ApiService from "../service/user/apiService";
import ForbiddenRequestException from "../exceptions/forbiddenRequestException";

/**
 * @description Check authentication status by token
 * @param req {Request} Express req object
 * @param res {Response} Express res object
 * @returns {Promise<*>}
 */
export async function getAccess(req: Request, res: Response): Promise<any> {
  const bearer = req.headers.authorization?.split(" ")?.[1] ?? undefined;

  let { expiry } = await ApiService.getByToken(bearer);

  if (new Date() > new Date(expiry)) {
    throw new ForbiddenRequestException("api token expired");
  }

  let accessToken = await JWTHelper.buildApiToken(bearer);

  res.json({
    accessToken,
  });
}