const productsRouter = require("express").Router();
const { postProduct } = require("../controllers/products/postProduct");
import { Request, Response } from "express";
import { getProducts } from "../controllers/products/getProducts";
import { getFeaturedProducts } from "../controllers/products/getFeaturedProducts";
import { updateProduct } from "../controllers/products/updateProduct";
import { deleteProduct } from "../controllers/products/deleteProduct";
import { getVendorProducts } from "../controllers/products/getVendorProducts";
import { getNewProducts } from "../controllers/products/getNewProducts";
import { getPopularProducts } from "../controllers/products/getPopularProducts";
import { getProductDetails } from "../controllers/products/getProductDetails";
import { imageUpload, handleUploadErrors } from "../middleware/imageUpload";
import { requireAuth } from "../middleware/auth";

productsRouter.post(
  "/api/v1/product",
  requireAuth,
  imageUpload.array("files", 20),
  handleUploadErrors,
  async (req: Request, res: Response) => {
    postProduct(req, res);
  },
);

productsRouter.get(
  "/api/v1/product",
  requireAuth,
  async (req: Request, res: Response) => {
    getProducts(req, res);
  },
);

productsRouter.get(
  "/api/v1/product/featured",
  requireAuth,
  async (req: Request, res: Response) => {
    getFeaturedProducts(req, res);
  },
);

productsRouter.get(
  "/api/v1/product/vendor/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    getVendorProducts(req, res);
  },
);

productsRouter.get(
  "/api/v1/product/new",
  requireAuth,
  async (req: Request, res: Response) => {
    getNewProducts(req, res);
  },
);

productsRouter.get(
  "/api/v1/product/popular",
  requireAuth,
  async (req: Request, res: Response) => {
    getPopularProducts(req, res);
  },
);

productsRouter.get(
  "/api/v1/product/details/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    getProductDetails(req, res);
  },
);

productsRouter.put(
  "/api/v1/product/:id",
  requireAuth,
  imageUpload.array("files", 5),
  handleUploadErrors,
  async (req: Request, res: Response) => {
    updateProduct(req, res);
  },
);

productsRouter.delete(
  "/api/v1/product/:id",
  requireAuth,
  async (req: Request, res: Response) => {
    deleteProduct(req, res);
  },
);

module.exports = productsRouter;
