import { Request, Response } from "express";
import { requireAuth, requireAdmin } from "../middleware/auth";

const reviewRouter = require("express").Router();
const { postReview } = require("../controllers/reviews/postReview");
const { updateReview } = require("../controllers/reviews/updateReview");
const { deleteReview } = require("../controllers/reviews/deleteReview");
const {
  getProductReviews,
} = require("../controllers/reviews/getProductReviews");
const { getOrderReviews } = require("../controllers/reviews/getOrderReviews");
const {
  deleteReviewAsAdmin,
} = require("../controllers/reviews/deleteReviewAsAdmin");
const {
  getVendorReviews,
} = require("../controllers/reviews/getVendorReviews");
const { reportReview } = require("../controllers/reviews/reportReview");
const {
  getReportedReviews,
} = require("../controllers/reviews/getReportedReviews");
const {
  dismissReportedReview,
} = require("../controllers/reviews/dismissReportedReview");

reviewRouter.post(
  "/api/v1/reviews",
  requireAuth,
  async (req: Request, res: Response) => {
    postReview(req, res);
  }
);

reviewRouter.put(
  "/api/v1/reviews/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    updateReview(req, res);
  }
);

reviewRouter.delete(
  "/api/v1/reviews/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    deleteReview(req, res);
  }
);

reviewRouter.get(
  "/api/v1/reviews/product/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    getProductReviews(req, res);
  }
);

reviewRouter.get(
  "/api/v1/reviews/order/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    getOrderReviews(req, res);
  }
);

reviewRouter.delete(
  "/api/v1/admin/reviews/:id",
  requireAdmin,
  async (req: Request, res: Response) => {
    deleteReviewAsAdmin(req, res);
  }
);

reviewRouter.get(
  "/api/v1/reviews/vendor/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    getVendorReviews(req, res);
  }
);

reviewRouter.post(
  "/api/v1/reviews/:id/report",
  requireAuth,
  async (req: Request, res: Response) => {
    reportReview(req, res);
  }
);

reviewRouter.get(
  "/api/v1/admin/reviews/reported",
  requireAdmin,
  async (req: Request, res: Response) => {
    getReportedReviews(req, res);
  }
);

reviewRouter.put(
  "/api/v1/admin/reviews/:id/dismiss",
  requireAdmin,
  async (req: Request, res: Response) => {
    dismissReportedReview(req, res);
  }
);

module.exports = reviewRouter;
