const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:3001";

function getToken(): string | null {
  if (typeof window === "undefined") return null;
  return localStorage.getItem("makanify_token");
}

async function apiRequest(path: string, options: RequestInit = {}) {
  const token = getToken();
  const headers: Record<string, string> = {
    "Content-Type": "application/json",
    ...(options.headers as Record<string, string>),
  };
  if (token) {
    headers["Authorization"] = `Bearer ${token}`;
  }

  const res = await fetch(`${API_URL}${path}`, {
    ...options,
    headers,
  });

  if (res.status === 401 || res.status === 403) {
    if (typeof window !== "undefined") {
      localStorage.removeItem("makanify_token");
      localStorage.removeItem("makanify_user");
      window.location.href = "/login";
    }
    throw new Error("Unauthorized");
  }

  if (!res.ok) {
    const data = await res.json().catch(() => ({}));
    throw new Error(data.error || `Request failed with status ${res.status}`);
  }

  return res.json();
}

export const api = {
  // Auth
  login: (email: string, password: string) =>
    apiRequest("/api/auth/login", {
      method: "POST",
      body: JSON.stringify({ email, password }),
    }),

  // Dashboard
  getDashboard: () => apiRequest("/api/dashboard"),

  // Leads
  getLeads: (params?: Record<string, string>) => {
    const query = params
      ? "?" + new URLSearchParams(params).toString()
      : "";
    return apiRequest(`/api/leads${query}`);
  },
  getLead: (id: string) => apiRequest(`/api/leads/${id}`),
  createLead: (data: Record<string, unknown>) =>
    apiRequest("/api/leads", {
      method: "POST",
      body: JSON.stringify(data),
    }),
  updateLead: (id: string, data: Record<string, unknown>) =>
    apiRequest(`/api/leads/${id}`, {
      method: "PATCH",
      body: JSON.stringify(data),
    }),
  startDemo: (id: string) =>
    apiRequest(`/api/leads/${id}/start-demo`, { method: "POST" }),
  markWon: (id: string, notes?: string) =>
    apiRequest(`/api/leads/${id}/mark-won`, {
      method: "POST",
      body: JSON.stringify({ notes }),
    }),
  markLost: (id: string, lost_reason: string, notes?: string) =>
    apiRequest(`/api/leads/${id}/mark-lost`, {
      method: "POST",
      body: JSON.stringify({ lost_reason, notes }),
    }),
  pauseSequence: (id: string) =>
    apiRequest(`/api/leads/${id}/pause-sequence`, { method: "POST" }),
  resumeSequence: (id: string) =>
    apiRequest(`/api/leads/${id}/resume-sequence`, { method: "POST" }),

  // Templates
  getTemplates: () => apiRequest("/api/templates"),
  updateTemplate: (key: string, data: Record<string, unknown>) =>
    apiRequest(`/api/templates/${key}`, {
      method: "PATCH",
      body: JSON.stringify(data),
    }),
  previewTemplate: (key: string) => apiRequest(`/api/templates/${key}/preview`),

  // Settings
  getSettings: () => apiRequest("/api/settings"),
  updateSettings: (data: Record<string, unknown>) =>
    apiRequest("/api/settings", {
      method: "PATCH",
      body: JSON.stringify(data),
    }),
};
