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

async function createUnit(req: Request, res: Response, next: NextFunction) {
  try {
    const unit = await unitModel.createUnit(req.body);
    return successResponse(res, 'Unit created successfully', unit, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getUnits(req: Request, res: Response, next: NextFunction) {
  try {
    const pagination = parsePagination(req.query);
    const [units, total] = await Promise.all([
      unitModel.getUnits(pagination),
      unitModel.countUnits(),
    ]);
    return successResponse(res, 'Units fetched successfully', paginatedResponse(units, total, pagination));
  } catch (error) {
    next(error);
    return;
  }
}

async function getUnit(req: Request, res: Response, next: NextFunction) {
  try {
    const unit = await unitModel.getUnitById(Number(req.params.id));
    if (!unit) return void errorResponse(res, 'Unit not found', 404);
    return successResponse(res, 'Unit fetched successfully', unit);
  } catch (error) {
    next(error);
    return;
  }
}

async function updateUnit(req: Request, res: Response, next: NextFunction) {
  try {
    const unit = await unitModel.updateUnit(Number(req.params.id), req.body);
    return successResponse(res, 'Unit updated successfully', unit);
  } catch (error) {
    next(error);
    return;
  }
}

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

export { createUnit, getUnits, getUnit, updateUnit, deleteUnit };
