import { BASE_URL } from "./endpoints";

interface RequestOptions extends RequestInit {
  auth?: boolean;
}

const getDeviceId = (): string => {
  if (typeof window === "undefined") return "unknown_device";

  let deviceId = localStorage.getItem("device_id");

  if (!deviceId) {
    deviceId = window.crypto?.randomUUID
      ? window.crypto.randomUUID()
      : Math.random().toString(36).substring(2) + Date.now().toString();

    localStorage.setItem("device_id", deviceId);
  }

  return deviceId;
};

const getLangId = () => {
  if (typeof window === "undefined") return "1";

  const lang = localStorage.getItem("selectedLanguage");
  return lang === "hindi" ? "2" : "1";
};

const getToken = (): string | null => {
  if (typeof window !== "undefined") {
    return localStorage.getItem("token");
  }
  return null;
};

export async function apiRequest<T>(
  endpoint: string,
  options: RequestOptions = {}
): Promise<T> {
  const url = `${BASE_URL}${endpoint}`;
  const token = getToken();
  const isFormData = options.body instanceof FormData;
  const langId = getLangId();

  const headers: Record<string, string> = {
    device_type: "3",
    device_id: getDeviceId(),
    version: "1.0.0",
    ...(isFormData ? {} : { "Content-Type": "application/json" }),
    langId,
    ...(options.headers as Record<string, string>),
  };

  if (token) {
    headers.Authorization = `Bearer ${token}`;
  }

  try {
    const response = await fetch(url, {
      ...options,
      headers,
    });

    const text = await response.text();

    let data: any;

    try {
      data = JSON.parse(text);
    } catch {
      data = {
        status: false,
        message: text || "Invalid server response",
      };
    }

    if (data && typeof data.status !== "undefined") {
      data.status = Boolean(data.status);
    }

    if (!response.ok) {
      return {
        status: false,
        message:
          data?.message ||
          `Server Error (${response.status})`,
        data: null,
      } as T;
    }

    return data as T;
  } catch (error: any) {
    console.error("❌ API Error:", error);

    return {
      status: false,
      message:
        error?.message === "Failed to fetch"
          ? "Unable to connect to server. Please check your internet connection."
          : error?.message || "Something went wrong. Please try again later.",
      data: null,
    } as T;
  }
}