import { io, Socket } from 'socket.io-client';

const WS_URL = process.env.NEXT_PUBLIC_WS_URL || 'http://localhost:3000';

let socket: Socket | null = null;

export function getSocket(): Socket {
  if (socket) return socket;

  const token = typeof window !== 'undefined' ? localStorage.getItem('token') : '';

  socket = io(WS_URL, {
    path: '/ws',
    auth: { token },
    transports: ['websocket', 'polling'],
    reconnection: true,
    reconnectionDelay: 1000,
    reconnectionAttempts: 10,
  });

  socket.on('connect', () => {
    console.log('[WS] Connected');
  });

  socket.on('disconnect', (reason) => {
    console.log('[WS] Disconnected:', reason);
  });

  socket.on('connect_error', (err) => {
    console.error('[WS] Connection error:', err.message);
  });

  return socket;
}

export function disconnectSocket() {
  if (socket) {
    socket.disconnect();
    socket = null;
  }
}

// Type-safe event listeners
export interface WsComment {
  igUsername: string;
  text: string;
  timestamp: string;
}

export interface WsBid {
  igUsername: string;
  amount: number;
  bidType: string;
  productName: string;
  status: string;
}

export interface WsAuction {
  id: string;
  productName: string;
  mode: string;
  startingPrice: number;
  timeLimitSeconds: number | null;
}

export interface WsAuctionEnd {
  id: string;
  productName: string;
  winnerIgUsername?: string;
  finalPrice: number;
}

export interface WsCartAdded {
  igUsername: string;
  productName: string;
  amount: number;
}

export interface WsCountdown {
  auctionItemId: string;
  secondsRemaining: number;
}

export interface WsStockUpdate {
  productId: string;
  remaining: number;
}
