import type { $Fetch } from "nitropack";

/**
 * Base API client composable.
 * Uses server-side apiBase for SSR requests, public apiBase for client-side.
 */
export function useApi() {
  const config = useRuntimeConfig();
  // On server: config.apiBase (http://backend:8000)
  // On client: config.public.apiBase (/api)
  const apiBase = import.meta.server ? config.apiBase : config.public.apiBase;

  const client: $Fetch = $fetch.create({
    baseURL: apiBase,
    headers: {
      "Content-Type": "application/json",
    },
  });

  async function get<T>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {
    return client<T>(url, {
      method: "GET",
      params: params as Record<string, string> | undefined,
    });
  }

  async function post<T>(url: string, body?: unknown): Promise<T> {
    return client<T>(url, {
      method: "POST",
      body,
    });
  }

  async function put<T>(url: string, body?: unknown): Promise<T> {
    return client<T>(url, {
      method: "PUT",
      body,
    });
  }

  async function del<T>(url: string): Promise<T> {
    return client<T>(url, {
      method: "DELETE",
    });
  }

  return {
    apiBase,
    client,
    get,
    post,
    put,
    del,
  };
}
