import type { Request, Response, NextFunction } from 'express';
import * as labourModel from '../models/labour.model.js';
import { successResponse, errorResponse } from '../utils/response.js';
import { parsePagination, paginatedResponse } from '../utils/pagination.js';

async function createLabour(req: Request, res: Response, next: NextFunction) {
  try {
    const labour = await labourModel.createLabour(req.body);
    return successResponse(res, 'Labour created successfully', labour, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getLabours(req: Request, res: Response, next: NextFunction) {
  try {
    const pagination = parsePagination(req.query);
    const [labours, total] = await Promise.all([
      labourModel.getLabours(pagination),
      labourModel.countLabours(),
    ]);
    return successResponse(res, 'Labours fetched successfully', paginatedResponse(labours, total, pagination));
  } catch (error) {
    next(error);
    return;
  }
}

async function getLabour(req: Request, res: Response, next: NextFunction) {
  try {
    const labour = await labourModel.getLabourById(Number(req.params.id));
    if (!labour) return void errorResponse(res, 'Labour not found', 404);
    return successResponse(res, 'Labour fetched successfully', labour);
  } catch (error) {
    next(error);
    return;
  }
}

async function updateLabour(req: Request, res: Response, next: NextFunction) {
  try {
    const labour = await labourModel.updateLabour(Number(req.params.id), req.body);
    return successResponse(res, 'Labour updated successfully', labour);
  } catch (error) {
    next(error);
    return;
  }
}

async function deleteLabour(req: Request, res: Response, next: NextFunction) {
  try {
    await labourModel.deleteLabour(Number(req.params.id));
    return successResponse(res, 'Labour deleted successfully');
  } catch (error) {
    next(error);
    return;
  }
}

export { createLabour, getLabours, getLabour, updateLabour, deleteLabour };
