import { io } from 'socket.io-client';
import { useAuth } from '@/auth';

let socket;

// Для блокировки аккаунта, добавляем состояние
let wasAccountBlocked = false;

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

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

  if (wasAccountBlocked) {
    console.log('[SocketService] Попытка подключения отклонена - аккаунт был заблокирован');
    return null;
  }

  if (isAuthenticated.value && user.value && user.value._id) {
    // Подключаемся только если пользователь аутентифицирован и есть ID
    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);
      
      // Если отключение произошло из-за блокировки аккаунта, 
      // не пытаемся автоматически переподключиться
      if (wasAccountBlocked && (reason === 'io server disconnect' || reason === 'transport close')) {
        console.log('[SocketService] Предотвращение переподключения из-за блокировки аккаунта');
        socket.disconnect();
        socket = null;
      }
    });

    socket.on('connect_error', (error) => {
      console.error('[SocketService] Ошибка подключения к Socket.IO:', error.message, error.data);
    });
    
    // ПЕРЕРАБОТАННЫЙ обработчик блокировки аккаунта
    socket.on('account_blocked', (data) => {
      console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
      
      // Устанавливаем флаг блокировки аккаунта для предотвращения повторных подключений
      wasAccountBlocked = true;
      
      // Принудительно прерываем соединение
      try {
        console.log('[SocketService] Принудительное отключение сокета из-за блокировки аккаунта');
        socket.disconnect();
      } catch (error) {
        console.error('[SocketService] Ошибка при отключении сокета:', error);
      }
      
      // Вызываем обработчик блокировки для немедленного выхода
      if (typeof handleAccountBlocked === 'function') {
        // Оборачиваем в try-catch для надежности
        try {
          handleAccountBlocked(data);
        } catch (error) {
          console.error('[SocketService] Ошибка при вызове handleAccountBlocked:', error);
          // Аварийный выход в случае ошибки в обработчике
          window.location.href = '/login?blocked=true';
        }
      } else {
        console.error('[SocketService] handleAccountBlocked не определен!');
        // Принудительная перезагрузка страницы
        window.location.reload();
      }
      
      // Дополнительно очищаем все соединения и состояние
      socket = null;
    });
    
    // Обработчик разблокировки аккаунта
    socket.on('account_unblocked', (data) => {
      console.log('[SocketService] Получено уведомление о разблокировке аккаунта:', data);
      wasAccountBlocked = false;
      
      if (typeof handleAccountUnblocked === 'function') {
        handleAccountUnblocked(data);
      } else {
        console.log('[SocketService] Аккаунт разблокирован, но обработчик не определен');
      }
    });
    
    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 = () => {
  // Если аккаунт был заблокирован, возвращаем null
  if (wasAccountBlocked) {
    console.warn('[SocketService] getSocket: Аккаунт заблокирован, сокет недоступен');
    return null;
  }

  if (!socket) {
    console.warn('[SocketService] getSocket вызван, но сокет не инициализирован. Попытка подключения...');
  }
  return socket;
};

// Новая функция для проверки статуса блокировки
export const isAccountBlocked = () => {
  return wasAccountBlocked;
};