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

async function createContractor(req: Request, res: Response, next: NextFunction) {
  try {
    const contractor = await contractorModel.createContractor(req.body);
    return successResponse(res, 'Contractor created successfully', contractor, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getContractors(req: Request, res: Response, next: NextFunction) {
  try {
    const pagination = parsePagination(req.query);
    const [contractors, total] = await Promise.all([
      contractorModel.getContractors(pagination),
      contractorModel.countContractors(),
    ]);
    return successResponse(res, 'Contractors fetched successfully', paginatedResponse(contractors, total, pagination));
  } catch (error) {
    next(error);
    return;
  }
}

async function getContractor(req: Request, res: Response, next: NextFunction) {
  try {
    const contractor = await contractorModel.getContractorById(Number(req.params.id));
    if (!contractor) return void errorResponse(res, 'Contractor not found', 404);
    return successResponse(res, 'Contractor fetched successfully', contractor);
  } catch (error) {
    next(error);
    return;
  }
}

async function updateContractor(req: Request, res: Response, next: NextFunction) {
  try {
    const contractor = await contractorModel.updateContractor(Number(req.params.id), req.body);
    return successResponse(res, 'Contractor updated successfully', contractor);
  } catch (error) {
    next(error);
    return;
  }
}

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

export { createContractor, getContractors, getContractor, updateContractor, deleteContractor };
