import { io } from 'socket.io-client';
import { API_URL } from '../config';

// Socket.IO 서버 URL (API_URL에서 '/api' 부분 제거)
const SOCKET_URL = API_URL.replace('/api', '');

// Socket.IO 클라이언트 인스턴스
let socket;

// Socket.IO 연결 설정
export const initSocket = () => {
  if (socket) return socket;
  
  socket = io(SOCKET_URL, {
    autoConnect: false,
    reconnection: true,
    reconnectionAttempts: 5,
    reconnectionDelay: 3000
  });
  
  // 연결 이벤트 핸들러
  socket.on('connect', () => {
    console.log('Socket.IO 서버에 연결되었습니다.');
    
    // 사용자 인증 정보 전송
    const token = localStorage.getItem('token');
    if (token) {
      try {
        const payload = JSON.parse(atob(token.split('.')[1]));
        socket.emit('authenticate', { id: payload.id });
      } catch (error) {
        console.error('토큰 파싱 오류:', error);
      }
    }
  });
  
  // 연결 오류 이벤트 핸들러
  socket.on('connect_error', (error) => {
    console.error('Socket.IO 연결 오류:', error);
  });
  
  // 연결 해제 이벤트 핸들러
  socket.on('disconnect', (reason) => {
    console.log('Socket.IO 연결이 해제되었습니다:', reason);
  });
  
  return socket;
};

// Socket.IO 연결
export const connectSocket = () => {
  if (!socket) initSocket();
  if (!socket.connected) socket.connect();
};

// Socket.IO 연결 해제
export const disconnectSocket = () => {
  if (socket && socket.connected) socket.disconnect();
};

// 이벤트 리스너 등록
export const onEvent = (event, callback) => {
  if (!socket) initSocket();
  socket.on(event, callback);
};

// 이벤트 리스너 제거
export const offEvent = (event, callback) => {
  if (!socket) return;
  if (callback) {
    socket.off(event, callback);
  } else {
    socket.off(event);
  }
};

export default {
  initSocket,
  connectSocket,
  disconnectSocket,
  onEvent,
  offEvent
};
