import { adminApiUrl } from "@/lib/apiUrl";

export const adminEndpoints = {
  login: adminApiUrl("/api/admin/login"),
  user: adminApiUrl("/api/admin/user"),
  logout: adminApiUrl("/api/admin/logout"),
  siteSettings: adminApiUrl("/api/admin/site-settings"),
  components: adminApiUrl("/api/admin/components"),
  componentsArchived: adminApiUrl("/api/admin/components?archived=1"),
  component: (id: number) => adminApiUrl(`/api/admin/components/${id}`),
  componentArchive: (id: number) => adminApiUrl(`/api/admin/components/${id}/archive`),
  componentRestore: (id: number) => adminApiUrl(`/api/admin/components/${id}/restore`),
  pages: adminApiUrl("/api/admin/pages"),
  page: (id: number) => adminApiUrl(`/api/admin/pages/${id}`),
  pageCopy: (id: number) => adminApiUrl(`/api/admin/pages/${id}/copy`),
};

const TOKEN_KEY = "admin_access_token";

function getAuthHeaders(): HeadersInit {
  const token = typeof sessionStorage !== "undefined" ? sessionStorage.getItem(TOKEN_KEY) : null;
  const headers: HeadersInit = { "Content-Type": "application/json" };
  if (token) (headers as Record<string, string>)["Authorization"] = `Bearer ${token}`;
  return headers;
}

async function handleResponse<T>(res: Response): Promise<T> {
  const data = await res.json().catch(() => ({}));
  if (!res.ok) throw new Error((data as { message?: string })?.message || res.statusText);
  return data as T;
}

export const adminApi = {
  async get<T>(url: string): Promise<T> {
    const res = await fetch(url, { headers: getAuthHeaders() });
    return handleResponse<T>(res);
  },
  async post<T>(url: string, body: unknown): Promise<T> {
    const res = await fetch(url, { method: "POST", headers: getAuthHeaders(), body: JSON.stringify(body) });
    return handleResponse<T>(res);
  },
  async put<T>(url: string, body: unknown): Promise<T> {
    const res = await fetch(url, { method: "PUT", headers: getAuthHeaders(), body: JSON.stringify(body) });
    return handleResponse<T>(res);
  },
  async delete<T>(url: string): Promise<T> {
    const res = await fetch(url, { method: "DELETE", headers: getAuthHeaders() });
    return handleResponse<T>(res);
  },
};
