import pygame
import math

# Initialize Pygame
pygame.init()

# Screen setup
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Interactive Adjustable Pendulum")

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (200, 50, 50)

# Clock for FPS
clock = pygame.time.Clock()
FPS = 60

# Pendulum properties
origin = (WIDTH // 2, 100)
length = 300
angle = math.pi / 4
angular_velocity = 0
angular_acceleration = 0
gravity = 0.8
dragging = False
drag_padding = 30  # extra radius for easier dragging

def get_bob_position(angle):
    x = origin[0] + length * math.sin(angle)
    y = origin[1] + length * math.cos(angle)
    return int(x), int(y)

bob_pos = get_bob_position(angle)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # Start dragging
        elif event.type == pygame.MOUSEBUTTONDOWN:
            mx, my = event.pos
            if math.hypot(mx - bob_pos[0], my - bob_pos[1]) < 20 + drag_padding:
                dragging = True
        # Stop dragging
        elif event.type == pygame.MOUSEBUTTONUP:
            dragging = False

    # Keyboard controls
    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP]:
        length += 1  # increase pendulum length
    if keys[pygame.K_DOWN]:
        length = max(50, length - 1)  # decrease length, min 50
    if keys[pygame.K_RIGHT]:
        gravity += 0.01
    if keys[pygame.K_LEFT]:
        gravity = max(0.1, gravity - 0.01)

    if dragging:
        mx, my = pygame.mouse.get_pos()
        dx = mx - origin[0]
        dy = my - origin[1]
        angle = math.atan2(dx, dy)
        angular_velocity = 0
        bob_pos = get_bob_position(angle)
    else:
        # Physics
        angular_acceleration = (-gravity / length) * math.sin(angle)
        angular_velocity += angular_acceleration
        angle += angular_velocity
        angular_velocity *= 0.99  # damping
        bob_pos = get_bob_position(angle)

    # Drawing
    screen.fill(BLACK)
    pygame.draw.line(screen, WHITE, origin, bob_pos, 3)
    pygame.draw.circle(screen, RED, bob_pos, 20)
    pygame.draw.circle(screen, WHITE, origin, 5)

    # Display info
    font = pygame.font.SysFont(None, 24)
    info = font.render(f"Length: {int(length)}  Gravity: {gravity:.2f}", True, WHITE)
    screen.blit(info, (10, 10))

    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
