import { Response } from 'express';
import { ApiResponse, PaginationMeta } from '../types';

export const respond = {
  ok<T>(res: Response, data: T, meta?: PaginationMeta, statusCode = 200): void {
    const body: ApiResponse<T> = { success: true, data };
    if (meta) body.meta = meta;
    res.status(statusCode).json(body);
  },
  created<T>(res: Response, data: T): void {
    respond.ok(res, data, undefined, 201);
  },
  error(res: Response, statusCode: number, code: string, message: string, details?: unknown): void {
    const body: ApiResponse<never> = { success: false, error: { code, message, statusCode, details } };
    res.status(statusCode).json(body);
  },
  notFound(res: Response, entity: string, id?: string | number): void {
    respond.error(res, 404, `${entity.toUpperCase()}_NOT_FOUND`, id ? `${entity} con ID ${id} no encontrado` : `${entity} no encontrado`);
  },
  unauthorized(res: Response, message = 'No autorizado'): void {
    respond.error(res, 401, 'UNAUTHORIZED', message);
  },
  forbidden(res: Response, message = 'Acceso denegado'): void {
    respond.error(res, 403, 'FORBIDDEN', message);
  },
  badRequest(res: Response, message: string, details?: unknown): void {
    respond.error(res, 400, 'BAD_REQUEST', message, details);
  },
};

export function buildMeta(total: number, page: number, limit: number): PaginationMeta {
  return { page, limit, total, totalPages: Math.ceil(total / limit) };
}

export function parsePagination(query: Record<string, unknown>): { page: number; limit: number; offset: number } {
  const page  = Math.max(1, parseInt(String(query.page  ?? 1),  10) || 1);
  const limit = Math.min(100, Math.max(1, parseInt(String(query.limit ?? 20), 10) || 20));
  return { page, limit, offset: (page - 1) * limit };
}
