import { fetchActiveServers, fetchOnlinePlayers, Server } from '../api';

/**
 * Проверяет, находится ли указанный игрок онлайн на любом из серверов
 * @param username Имя игрока для проверки
 * @returns {Promise<boolean>} true, если игрок онлайн хотя бы на одном сервере
 */
export async function isPlayerOnline(username: string): Promise<boolean> {
  try {
    console.log('Начинаем проверку статуса для:', username);

    // Получаем список активных серверов (теперь это массив)
    const servers = await fetchActiveServers();
    console.log('Ответ API активных серверов:', servers);

    // Фильтруем серверы с игроками
    const serversWithPlayers = servers.filter(
      (server) => server.online_players > 0,
    );

    // Если нет серверов с игроками, игрок точно не онлайн
    if (serversWithPlayers.length === 0) {
      return false;
    }

    // Проверяем каждый сервер на наличие игрока
    const checkPromises = serversWithPlayers.map(async (server) => {
      try {
        const onlinePlayers = await fetchOnlinePlayers(server.id);

        // Проверяем, есть ли игрок с указанным именем в списке
        // Предполагая, что онлайн игроки хранятся в массиве online_players
        return (
          Array.isArray(onlinePlayers.online_players) &&
          onlinePlayers.online_players.some(
            (player) => player.username === username,
          )
        );
      } catch (error) {
        console.error(`Ошибка при проверке сервера ${server.id}:`, error);
        return false;
      }
    });

    // Ожидаем результаты всех проверок
    const results = await Promise.all(checkPromises);

    // Игрок онлайн, если хотя бы одна проверка вернула true
    return results.some((result) => result);
  } catch (error) {
    console.error('Ошибка при проверке онлайн-статуса игрока:', error);
    return false; // В случае ошибки считаем, что игрок не онлайн
  }
}

/**
 * Проверяет, находится ли указанный игрок онлайн на конкретном сервере
 * @param username Имя игрока для проверки
 * @param serverId ID сервера для проверки
 * @returns {Promise<boolean>} true, если игрок онлайн на указанном сервере
 */
export async function isPlayerOnlineOnServer(
  username: string,
  serverId: string,
): Promise<boolean> {
  try {
    const onlinePlayers = await fetchOnlinePlayers(serverId);

    return (
      Array.isArray(onlinePlayers.online_players) &&
      onlinePlayers.online_players.some(
        (player) => player.username === username,
      )
    );
  } catch (error) {
    console.error(`Ошибка при проверке игрока на сервере ${serverId}:`, error);
    return false;
  }
}

/**
 * Проверяет, на каком сервере находится игрок
 * @param username Имя игрока для проверки
 * @returns Объект с информацией: онлайн ли игрок и на каком сервере
 */
export async function getPlayerServer(
  username: string,
): Promise<{ online: boolean; server: Server | null }> {
  try {
    // Получаем список активных серверов
    const servers = await fetchActiveServers();

    // Фильтруем серверы с игроками
    const serversWithPlayers = servers.filter(
      (server) => server.online_players > 0,
    );

    // Если нет серверов с игроками, игрок точно не онлайн
    if (serversWithPlayers.length === 0) {
      return { online: false, server: null };
    }

    // Проверяем каждый сервер на наличие игрока
    for (const server of serversWithPlayers) {
      try {
        const onlinePlayers = await fetchOnlinePlayers(server.id);

        if (
          Array.isArray(onlinePlayers.online_players) &&
          onlinePlayers.online_players.some(
            (player) => player.username === username,
          )
        ) {
          // Игрок найден на этом сервере
          return { online: true, server };
        }
      } catch (error) {
        console.error(`Ошибка при проверке сервера ${server.id}:`, error);
      }
    }

    // Игрок не найден ни на одном сервере
    return { online: false, server: null };
  } catch (error) {
    console.error('Ошибка при проверке сервера игрока:', error);
    return { online: false, server: null };
  }
}
