import { io } from 'socket.io-client';
import { useAuth } from '@/auth'; // Чтобы получить ID текущего пользователя

let socket;

// const SOCKET_URL = 'http://localhost:5000'; // Закомментируем, так как Vite будет проксировать
// Для разработки через Vite proxy, URL должен быть относительным к домену фронтенда
const SOCKET_URL = '/'; // Vite будет перехватывать /socket.io/ путь

export const connectSocket = () => {
  const { user, isAuthenticated } = useAuth();

  if (isAuthenticated.value && user.value && user.value._id) {
    // Подключаемся только если пользователь аутентифицирован и есть ID
    // Передаем userId в query для идентификации на сервере при подключении (альтернатива событию addUser)
    // Однако, мы используем событие addUser, так что query здесь может быть избыточен, если сервер его не использует при connect.
    // Оставим его, если вдруг понадобится.
    // socket = io(SOCKET_URL, {
    //   query: { userId: user.value._id } 
    // });

    // При использовании Vite proxy, путь для Socket.IO должен быть относительным,
    // а Vite добавит префикс /socket.io/ к target в proxy.
    // Однако, клиентская библиотека socket.io обычно сама добавляет /socket.io/
    // поэтому мы можем просто указать базовый URL (который будет проксироваться)
    // или указать полный путь, который будет проксирован.
    // Для ясности и чтобы соответствовать настройке proxy, можно использовать path.
    socket = io(SOCKET_URL, {
      path: '/socket.io/', // Явно указываем путь, который будет проксироваться
      transports: ['websocket', 'polling'] // Явно указываем транспорты для лучшей совместимости
    });

    console.log('[SocketService] Попытка подключения к Socket.IO серверу через Vite proxy...');

    socket.on('connect', () => {
      console.log('[SocketService] Успешно подключен к Socket.IO. Socket ID:', socket.id);
      // Отправляем ID пользователя на сервер, чтобы он знал, кто подключился
      socket.emit('addUser', user.value._id); 
    });

    socket.on('disconnect', (reason) => {
      console.log('[SocketService] Отключен от Socket.IO. Причина:', reason);
    });

    socket.on('connect_error', (error) => {
      console.error('[SocketService] Ошибка подключения к Socket.IO:', error.message, error.data);
    });
    
    // Можно здесь же слушать глобальные события, если нужно
    // socket.on('getUsers', (users) => {
    //   console.log('[SocketService] Получен список активных пользователей:', users);
    //   // Тут можно обновить какой-нибудь стор активных пользователей
    // });

    return socket;
  } else {
    console.warn('[SocketService] Не удалось подключиться: пользователь не аутентифицирован или нет ID.');
    return null;
  }
};

export const disconnectSocket = () => {
  if (socket) {
    console.log('[SocketService] Отключение от Socket.IO...');
    socket.disconnect();
    socket = null;
  }
};

export const getSocket = () => {
  if (!socket) {
    console.warn('[SocketService] getSocket вызван, но сокет не инициализирован. Попытка подключения...');
    // Можно попробовать подключиться здесь, если это желаемое поведение,
    // но лучше управлять подключением более явно.
    // return connectSocket(); // Будь осторожен с рекурсией или множественными подключениями
  }
  return socket;
};

// Функции для отправки и прослушивания специфичных событий можно добавить здесь
// или использовать getSocket() в компонентах и вызывать socket.emit / socket.on там.

// Пример:
// export const sendMessageOnSocket = (messageData) => {
//   const currentSocket = getSocket();
//   if (currentSocket) {
//     currentSocket.emit('sendMessage', messageData);
//   } else {
//     console.error('[SocketService] Не могу отправить сообщение: сокет не подключен.');
//   }
// };

// export const listenForMessage = (callback) => {
//   const currentSocket = getSocket();
//   if (currentSocket) {
//     currentSocket.on('getMessage', callback);
//     // Возвращаем функцию для отписки
//     return () => currentSocket.off('getMessage', callback);
//   }
//   return () => {}; // Пустая функция отписки, если сокета нет
// };