import { toRadians } from '../../lib/toRadians/toRadians';

/**
 * Класс сущности "мяч"
 * @class
 */
export class Ball {
  /**
   * @param {number} x координата положения мяча по оси X
   * @param {number} y координата положения мяча по оси Y
   * @param {number} radius положительное числовое значение радиуса мяча
   * @param {number} speed положительное числовое значение скорости мяча
   * @param {number} angle угол направления движения мяча в градусах
   */
  constructor(x, y, radius, speed = 0, angle = 0) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.speed = speed;
    this.angle = angle;
    this.verticalSpeed = speed * Math.cos(toRadians(angle));
    this.horizontalSpeed = -1 * speed * Math.sin(toRadians(angle));
    this.status = 'idle';

    this.defaultX = x;
    this.defaultY = y;
    this.defaultVerticalSpeed = this.verticalSpeed;
    this.defaultHorizontalSpeed = this.horizontalSpeed;
  }

  /**
   * Изменяет координаты в зависимости от скорости и времени
   * @param {*} deltaTime изменение времени из Ticker
   */
  moveForward(deltaTime) {
    this.x += this.horizontalSpeed * deltaTime;
    this.y += this.verticalSpeed * deltaTime;
  }

  /**
   * Возвращает значения к дефолтным
   */
  reset(x = this.defaultX, y = this.defaultY) {
    this.x = x;
    this.y = y;
    this.verticalSpeed = this.defaultVerticalSpeed;
    this.horizontalSpeed = this.defaultHorizontalSpeed;
    this.status = 'idle';
  }

  /**
   * Запускает мяч с ракетки - переводит из ожидания в игру
   */
  launch() {
    if (this.status === 'idle') {
      this.status = 'moving';
    }
  }

  /**
   * Увеличивает скорость мяча не меняя направление
   * @param {number} step положительное числовое значение прибавки к скорости
   */
  increaseSpeed(step) {
    if (this.speed <= 0) {
      return;
    }

    const magnifyingCoeficient = (this.speed + step) / this.speed;
    this.speed += step;

    this.verticalSpeed *= magnifyingCoeficient;
    this.horizontalSpeed *= magnifyingCoeficient;
    this.defaultVerticalSpeed *= magnifyingCoeficient;
    this.defaultHorizontalSpeed *= magnifyingCoeficient;
  }
}
