import { Request, Response } from "express";
import { isValidObjectId } from "mongoose";
import review from "../../models/review";
import product from "../../models/product";

const getProductReviews = async (req: Request, res: Response) => {
  const { id } = req.params;
  // `perPage` is the standard param name used across the rest of the API;
  // `limit` is kept as a fallback for any existing caller still using it.
  const { page = 1, perPage, limit = 20 } = req.query;
  const pageSize = perPage ?? limit;

  if (!isValidObjectId(id)) {
    return res.status(400).json({ message: "product id is not valid" });
  }

  try {
    const productDoc = await product.findById(id);

    if (!productDoc) {
      return res.status(404).json({ message: "product not found" });
    }

    const filter = { product: id, isDeleted: { $ne: true } };
    const [reviews, totalItemCount] = await Promise.all([
      review
        .find(filter)
        .sort({ createdAt: -1 })
        .skip((Number(page) - 1) * Number(pageSize))
        .limit(Number(pageSize)),
      review.countDocuments(filter),
    ]);

    return res.status(200).json({
      reviews,
      totalItemCount,
      avgRating: productDoc.avgRating,
      weightedRating: productDoc.weightedRating,
      reviewCount: productDoc.reviewCount,
    });
  } catch (err) {
    return res.status(500).json({ message: err });
  }
};

export { getProductReviews };
