from pandemonium import exposed, Vector2, Area2D


DEFAULT_SPEED = 220


@exposed
class Ball(Area2D):
    def _reset_ball(self, for_left):
        self.position = self.screen_size / 2
        if for_left:
            self.direction = Vector2(-1, 0)
        else:
            self.direction = Vector2(1, 0)
        self.ball_speed = DEFAULT_SPEED

    def stop(self):
        self.stopped = True

    def _process(self, delta):
        # ball will move normally for both players
        # even if it's sightly out of sync between them
        # so each player sees the motion as smooth and not jerky
        if not self.stopped:
            self.translate(self.direction * self.ball_speed * delta)

        # check screen bounds to make ball bounce
        if (self.position.y < 0 and self.direction.y < 0) or (
            self.position.y > self.screen_size.y and self.direction.y > 0
        ):
            self.direction.y = -self.direction.y

        if self.position.x < 0 or self.position.x > self.screen_size.x:
            for_left = self.position.x > 0
            self.get_parent().update_score(for_left)
            self._reset_ball(for_left)

    def bounce(self, left, random):
        # using sync because both players can make it bounce
        if left:
            self.direction.x = abs(self.direction.x)
        else:
            self.direction.x = -abs(self.direction.x)
        self.ball_speed *= 1.1
        self.direction.y = random * 2.0 - 1
        self.direction = self.direction.normalized()

    def _ready(self):
        self.direction = Vector2(1, 0)
        self.ball_speed = DEFAULT_SPEED
        self.stopped = False
        self.screen_size = self.get_viewport_rect().size
        self.set_process(True)  # REMOVE ME