import { type NextFunction, type Request, type Response } from "express";
import jwt from "jsonwebtoken";
import log from "../config/log.js";
import type CustomRequest from "../types/requestType.js";

const authorize = async (
  req: CustomRequest,
  res: Response,
  next: NextFunction
) => {
  const token = req.headers.authorization;
  if (!token) {
    log.info("[Middleware], [Authorization], No Token Available");
    return res.status(401).json({
      msg: "Unauthorized Access",
      isSuccess: false,
    });
  }
  try {
    //log.info(`[Middleware], [Authorization], Token [${token}], Verifying Token`);
    const decoded: any = jwt.verify(
      token.replace("Bearer ", ""),
      process.env.TOKEN_SECRET as string
    );

    const { id, type, platform} = decoded;

    req.id = id;
    req.userType = type;
    req.platform = platform;

    if(!id && decoded?.routeAccess) {
      let routeAccess = decoded?.routeAccess;
      const hasAccess = routeAccess.includes(req.originalUrl);
      log.info(`[Middleware], [Authorization], Token [${token}], Accessing route [${req.originalUrl}], Has Access [${hasAccess}]`);
      if(!hasAccess) {
        return res.status(401).json({
          msg: "Unauthorized Access",
          isSuccess: false,
        });
      }
    }
    next();
  } catch (err: any) {
    //log.info(`[Middleware], [Authorization], Token [${token}], Token Expired`);
    log.info(`[Middleware], [Authorization], Token [${token}], [Token Expired], Catch Error [${JSON.stringify(err)}]`);
    return res.status(401).json({
      msg: err?.message || err,
      isSuccess: false,
    });
  }
};

export default authorize;
