import { Response, NextFunction } from "express";
import { AuthRequest } from "../../shared/types";
import { respond } from "../../shared/utils/apiResponse";
import { productService } from "./products.service";
import {
  ProductCodeParam,
  ProductIdParam,
  ProductListQuery,
} from "./products.schema";

export const productController = {
  async list(
    req: AuthRequest,
    res: Response,
    next: NextFunction,
  ): Promise<void> {
    try {
      const query = res.locals.validated.query as ProductListQuery;

      const { products, pagination } = await productService.getProducts(query);

      respond.ok(res, products, pagination);
    } catch (err) {
      next(err);
    }
  },

  async getById(
    req: AuthRequest,
    res: Response,
    next: NextFunction,
  ): Promise<void> {
    try {
      const { id } = res.locals.validated.params as ProductIdParam;

      const product = await productService.getProductById(id);

      if (!product) {
        respond.notFound(res, "Producto", id);
        return;
      }

      respond.ok(res, product);
    } catch (err) {
      next(err);
    }
  },

  async getByCode(
    req: AuthRequest,
    res: Response,
    next: NextFunction,
  ): Promise<void> {
    try {
      const { code } = res.locals.validated.params as ProductCodeParam;

      const product = await productService.getProductByCode(code);

      if (!product) {
        respond.notFound(res, "Producto");
        return;
      }

      respond.ok(res, product);
    } catch (err) {
      next(err);
    }
  },
};
