import { io, type Socket } from "socket.io-client";

let socketInstance: Socket | null = null;
let socketToken: string | null = null;

function getSocketBaseUrl(): string {
  const socketUrl = process.env.NEXT_PUBLIC_SOCKET_URL?.trim();
  const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL?.trim() || "";

  if (apiUrl) {
    return apiUrl.replace(/\/api\/v1\/?$/, "").replace(/\/$/, "");
  }
  if (socketUrl) {
    return socketUrl.replace(/\/$/, "");
  }
  return "";
}

export function getOrCreateChatSocket(token: string | undefined): Socket | null {
  if (typeof window === "undefined" || !token) return null;

  if (socketInstance && socketToken === token) {
    return socketInstance;
  }

  if (socketInstance) {
    socketInstance.removeAllListeners();
    socketInstance.disconnect();
    socketInstance = null;
  }

  socketInstance = io(getSocketBaseUrl(), {
    auth: { token: `Bearer ${token}` },
    transports: ["websocket"],
    reconnection: true,
    reconnectionAttempts: 10,
  });

  socketToken = token;
  return socketInstance;
}
