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

async function createVendor(req: Request, res: Response, next: NextFunction) {
  try {
    const vendor = await vendorModel.createVendor(req.body);
    return successResponse(res, 'Vendor created successfully', vendor, 201);
  } catch (error) {
    next(error);
    return;
  }
}

async function getVendors(req: Request, res: Response, next: NextFunction) {
  try {
    const pagination = parsePagination(req.query);
    const [vendors, total] = await Promise.all([
      vendorModel.getVendors(pagination),
      vendorModel.countVendors(),
    ]);
    return successResponse(res, 'Vendors fetched successfully', paginatedResponse(vendors, total, pagination));
  } catch (error) {
    next(error);
    return;
  }
}

async function getVendor(req: Request, res: Response, next: NextFunction) {
  try {
    const vendor = await vendorModel.getVendorById(Number(req.params.id));
    if (!vendor) return void errorResponse(res, 'Vendor not found', 404);
    return successResponse(res, 'Vendor fetched successfully', vendor);
  } catch (error) {
    next(error);
    return;
  }
}

async function updateVendor(req: Request, res: Response, next: NextFunction) {
  try {
    const vendor = await vendorModel.updateVendor(Number(req.params.id), req.body);
    return successResponse(res, 'Vendor updated successfully', vendor);
  } catch (error) {
    next(error);
    return;
  }
}

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

export { createVendor, getVendors, getVendor, updateVendor, deleteVendor };
