import { Ball } from '../../entities/ball/ball';

/**
 * Двигает мяч и обрабатывает отскок от стен. Возвращает true, если мяч уже отскочил или вышел за нижнюю границу
 * @param {Ball} ball мяч
 * @param {number} containerWidth ширина игрового контейнера в пикселях
 * @param {number} containerHeight высота игрового контейнера в пикселях
 * @returns {boolean}
 */
export function processBall(ball, containerWidth, containerHeight) {
  try {
    if (!(ball instanceof Ball)) {
      throw new Error('Аргумент ball должен быть экземпляром класса мяча');
    }

    if (typeof containerWidth !== 'number' || typeof containerHeight !== 'number') {
      throw new Error('Значения размеров игрового контейнера должены являться числами');
    }

    if (containerWidth <= 0 || containerHeight <= 0) {
      throw new Error('Размеры игрового контейнера должены быть положительными числами');
    }

    const leftBoundary = ball.radius;
    const rightBoundary = containerWidth - ball.radius;
    const topBoundary = ball.radius;
    const bottomBoundary = containerHeight - ball.radius;

    // Не даем мячу выйти за границы стен слева / справав и меняем направление
    if (ball.x <= leftBoundary || ball.x >= rightBoundary) {
      ball.x = ball.x <= leftBoundary ? leftBoundary : rightBoundary;
      ball.horizontalSpeed *= -1;
      return true;
    }

    // Не даем мячу выйти за границу стены сверху и меняем направление
    if (ball.y <= topBoundary) {
      ball.y = topBoundary;
      ball.verticalSpeed *= -1;
      return true;
    }

    // Проверяем выход за границу стены снизу
    if (ball.y >= bottomBoundary) {
      ball.status = 'out';
      return true;
    }

    return false;
  } catch (err) {
    console.error(err);
    return null;
  }
}
