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

const GATEWAY_URL = process.env['NEXT_PUBLIC_GATEWAY_URL'] ?? 'http://localhost:14242';

let socket: Socket | null = null;

export function getSocket(): Socket {
  if (!socket) {
    socket = io(`${GATEWAY_URL}/chat`, {
      withCredentials: true,
      autoConnect: false,
      transports: ['websocket', 'polling'],
    });

    // Reset singleton reference when socket is fully closed so the next
    // getSocket() call creates a fresh instance instead of returning a
    // closed/dead socket.
    socket.on('disconnect', () => {
      socket = null;
    });
  }
  return socket;
}

/** Tear down the singleton socket and reset the reference. */
export function destroySocket(): void {
  if (socket) {
    socket.offAny();
    socket.disconnect();
    socket = null;
  }
}
