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

async function createEquipment(req: Request, res: Response, next: NextFunction) {
  try {
    const equipment = await equipmentModel.createEquipment(req.body);
    return successResponse(res, 'Equipment created successfully', equipment, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getEquipmentList(req: Request, res: Response, next: NextFunction) {
  try {
    const pagination = parsePagination(req.query);
    const [items, total] = await Promise.all([
      equipmentModel.getEquipmentList(pagination),
      equipmentModel.countEquipment(),
    ]);
    return successResponse(res, 'Equipment fetched successfully', paginatedResponse(items, total, pagination));
  } catch (error) {
    next(error);
    return;
  }
}

async function getEquipment(req: Request, res: Response, next: NextFunction) {
  try {
    const equipment = await equipmentModel.getEquipmentById(Number(req.params.id));
    if (!equipment) return void errorResponse(res, 'Equipment not found', 404);
    return successResponse(res, 'Equipment fetched successfully', equipment);
  } catch (error) {
    next(error);
    return;
  }
}

async function updateEquipment(req: Request, res: Response, next: NextFunction) {
  try {
    const equipment = await equipmentModel.updateEquipment(Number(req.params.id), req.body);
    return successResponse(res, 'Equipment updated successfully', equipment);
  } catch (error) {
    next(error);
    return;
  }
}

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

export { createEquipment, getEquipmentList, getEquipment, updateEquipment, deleteEquipment };
