from ctypes import *
from time import time

rl = CDLL("../_raylib-5.5_linux_amd64/lib/libraylib.so")

class Image(Structure):
    _fields_ = [
        ("data", c_void_p),
        ("width", c_int),
        ("height", c_int),
        ("mipmaps", c_int),
        ("format", c_int),
    ]

class Texture2D(Structure):
    _fields_ = [
        ("id", c_uint),
        ("width", c_int),
        ("height", c_int),
        ("mipmaps", c_int),
        ("format", c_int),
    ]

class Vector2(Structure):
    _fields_ = [
        ("x", c_float),
        ("y", c_float),
    ]

class Color(Structure):
    _fields_ = [
        ("r", c_ubyte),
        ("g", c_ubyte),
        ("b", c_ubyte),
        ("a", c_ubyte),
    ]

rl.LoadImage.restype = Image
rl.LoadTextureFromImage.restype = Texture2D
rl.GetFrameTime.restype = c_float

WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
LOGO_HEIGHT = 64
LOGO_SPEED = 300
BLACK = Color(r=0,g=0,b=0,a=255)
WHITE = Color(r=255,g=255,b=255,a=255)


rl.InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, b"Raylib in Python")
rl.SetTargetFPS(60)
rl.SetRandomSeed(int(time()))

logo_image = rl.LoadImage(b"./python_logo.png")
rl.ImageResize(byref(logo_image), logo_image.width * LOGO_HEIGHT // logo_image.height, LOGO_HEIGHT)
logo_texture = rl.LoadTextureFromImage(logo_image)
rl.UnloadImage(logo_image)

x = rl.GetRandomValue(0, WINDOW_WIDTH - logo_texture.width)
y = rl.GetRandomValue(0, WINDOW_HEIGHT - logo_texture.height)

dx = LOGO_SPEED * (-1 if rl.GetRandomValue(0, 1) else 1)
dy = LOGO_SPEED * (-1 if rl.GetRandomValue(0, 1) else 1)

while not rl.WindowShouldClose():
    delta_time = rl.GetFrameTime()

    x += dx * delta_time
    y += dy * delta_time

    if x < 0 or (x + logo_texture.width) >= WINDOW_WIDTH - 1:
        dx *= -1
        x += dx * delta_time
    if y < 0 or (y + logo_texture.height) >= WINDOW_HEIGHT - 1:
        dy *= -1
        y += dy * delta_time

    rl.BeginDrawing()

    rl.ClearBackground(BLACK)
    rl.DrawTextureV(logo_texture, Vector2(x=x, y=y), WHITE)

    rl.EndDrawing()

rl.UnloadTexture(logo_texture)
rl.CloseWindow()
