import { NextResponse } from "next/server";
import { ApiResponse, PaginationResponse, PaginatedApiResponse } from "./types";

/**
 * Standard success response handler
 * @param data The data to return in the response
 * @param status HTTP status code (default: 200)
 */
export function successResponse<T>(data: T, status: number = 200) {
  return NextResponse.json(
    {
      success: true,
      data,
    } as ApiResponse<T>,
    { status }
  );
}

/**
 * Standard error response handler
 * @param message Error message
 * @param status HTTP status code (default: 500)
 */
export function errorResponse(message: string, status: number = 500) {
  console.error(`API error: ${message}`);
  return NextResponse.json(
    { 
      success: false,
      error: message 
    } as ApiResponse<never>,
    { status }
  );
}

/**
 * Standard pagination response format
 * @param data Array of items to return
 * @param pagination Pagination information
 */
export function paginationResponse<T>(data: T[], pagination: PaginationResponse | null) {
  return NextResponse.json({
    data: data || [],
    pagination: pagination || {
      page: 1,
      size: 10,
      totalCount: 0,
      totalItems: 0,
      totalPages: 0,
      pageCount: 0,
      orderField: ["name"],
      orderType: ["asc"],
      query: {},
      next: false,
      back: false,
    },
  } as PaginatedApiResponse<T>);
}

/**
 * Create response handler
 * @param data The created item data
 */
export function createResponse<T>(data: T) {
  return successResponse(
    {
      ...data as any,
      createdAt: new Date().toISOString(),
    } as T, 
    201
  );
}

/**
 * Update response handler
 * @param data The updated item data
 */
export function updateResponse<T>(data: T) {
  return successResponse(
    {
      ...data as any,
      updatedAt: new Date().toISOString(),
    } as T
  );
}

/**
 * Delete response handler
 */
export function deleteResponse() {
  return successResponse({ message: "Item deleted successfully" }, 204);
}
