import { asyncHandler } from "@helper/async-handler.helper";
import { LeftoverService } from "./leftover.service";
import { Request, Response, NextFunction } from "express";

export class LeftoverController {
    constructor(
        private readonly leftoverService: LeftoverService
    ) { }

    create = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const files = req.files as Express.Multer.File[];
        const userId = (req as any).user.id;
        const response = await this.leftoverService.create(req.body, userId, files);
        res.status(response.statusCode).json(response);
    })

    findAll = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const page = parseInt(req.query.page as string) || 1;
        const limit = parseInt(req.query.limit as string) || 10;
        const userId = req.query.userId ? parseInt(req.query.userId as string) : undefined;
        // Optionally pass currentUserId if authenticateToken adds user to request for public routes. 
        // If route is public but user might be logged in, we check if req.user exists.
        const currentUserId = (req as any).user?.id;
        const response = await this.leftoverService.findAll(page, limit, userId, currentUserId);
        res.status(response.statusCode).json(response);
    })

    findOne = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const id = parseInt(req.params.id);
        const response = await this.leftoverService.findOne(id);
        res.status(response.statusCode).json(response);
    })

    update = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const id = parseInt(req.params.id);
        const files = req.files as Express.Multer.File[];
        const response = await this.leftoverService.update(id, req.body, files);
        res.status(response.statusCode).json(response);
    })

    delete = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const id = parseInt(req.params.id);
        const response = await this.leftoverService.delete(id);
        res.status(response.statusCode).json(response);
    })

    updateStatus = asyncHandler(async (req: Request, res: Response, next: NextFunction) => {
        const id = parseInt(req.params.id);
        const response = await this.leftoverService.updateStatus(id, req.body);
        res.status(response.statusCode).json(response);
    })
}
