import pygame
import sys
import math
import pygui
from pygui_pygame_backend import Render, Rect, get_mouse_pos, get_mouse_pressed, MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION
import pygui_pygame_backend as backend

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Bouncing Ball with Enhanced PyGUI")
clock = pygame.time.Clock()

# Create the backend renderer and assign the backend to PyGUI.
renderer = Render(screen)
pygui.PyGUI.set_backend(backend, renderer)

# ---------------------
# Ball Simulation
# ---------------------
class Ball:
    def __init__(self, pos, velocity, radius, color):
        self.pos = list(pos)
        self.velocity = list(velocity)
        self.radius = radius
        self.color = color

    def update(self):
        self.pos[0] += self.velocity[0]
        self.pos[1] += self.velocity[1]
        if self.pos[0] - self.radius < 0 or self.pos[0] + self.radius > WIDTH:
            self.velocity[0] = -self.velocity[0]
        if self.pos[1] - self.radius < 0 or self.pos[1] + self.radius > HEIGHT:
            self.velocity[1] = -self.velocity[1]

    def draw(self, surface):
        pygame.draw.circle(surface, self.color, (int(self.pos[0]), int(self.pos[1])), int(self.radius))

ball = Ball((WIDTH // 2, HEIGHT // 2), (4, 3), 30, (255, 100, 50))
ball_speed = 4.0
ball_direction = 0.0
ball_radius = 30.0
ball_color_r = 255.0
ball_color_g = 100.0
ball_color_b = 50.0
bounce_enabled = True

running = True
while running:
    dt = clock.tick(60) / 1000.0
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        pygui.PyGUI.handle_event(event)

    screen.fill((30, 30, 30))

    # Draw a draggable, auto–sizing GUI window.
    pygui.PyGUI.Begin("Ball Controls", 10, 10)
    ball_speed = pygui.PyGUI.Slider("Speed", ball_speed, 1, 10)
    ball_direction = pygui.PyGUI.Slider("Direction", ball_direction, 0, 360)
    ball_radius = pygui.PyGUI.Slider("Radius", ball_radius, 10, 100)
    ball_color_r = pygui.PyGUI.Slider("Red", ball_color_r, 0, 255)
    ball_color_g = pygui.PyGUI.Slider("Green", ball_color_g, 0, 255)
    ball_color_b = pygui.PyGUI.Slider("Blue", ball_color_b, 0, 255)
    bounce_enabled = pygui.PyGUI.Checkbox("Bounce", bounce_enabled)
    if pygui.PyGUI.Button("Reset Position"):
        ball.pos = [WIDTH // 2, HEIGHT // 2]
    pygui.PyGUI.End()

    rad = math.radians(ball_direction)
    ball.velocity[0] = ball_speed * math.cos(rad)
    ball.velocity[1] = ball_speed * math.sin(rad)
    ball.radius = ball_radius
    ball.color = (int(ball_color_r), int(ball_color_g), int(ball_color_b))
    if not bounce_enabled:
        ball.velocity[0] *= 0.5
        ball.velocity[1] *= 0.5

    ball.update()
    ball.draw(screen)

    pygame.display.flip()
    pygui.PyGUI.update()

pygame.quit()
sys.exit()
