const std = @import("std");
const rl = @cImport({
    @cInclude("raylib.h");
});

const WINDOW_WIDTH = 800;
const WINDOW_HEIGHT = 600;
const LOGO_HEIGHT = 64;
const LOGO_SPEED: f32 = 300;

const BLACK = rl.Color{ .r = 0, .g = 0, .b = 0, .a = 255 };
const WHITE = rl.Color{ .r = 255, .g = 255, .b = 255, .a = 255 };

pub fn main() void {
    rl.InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Raylib in Zig");
    rl.SetTargetFPS(60);
    rl.SetRandomSeed(@intCast(std.time.timestamp()));

    var logo_image = rl.LoadImage("./zig_logo.png");
    rl.ImageResize(&logo_image, @divTrunc(logo_image.width * LOGO_HEIGHT, logo_image.height), LOGO_HEIGHT);
    const logo_texture = rl.LoadTextureFromImage(logo_image);
    rl.UnloadImage(logo_image);

    var x: f32 = @floatFromInt(rl.GetRandomValue(0, WINDOW_WIDTH - logo_texture.width));
    var y: f32 = @floatFromInt(rl.GetRandomValue(0, WINDOW_HEIGHT - logo_texture.height));

    var dx: f32 = if (rl.GetRandomValue(0, 1) == 1) -LOGO_SPEED else LOGO_SPEED;
    var dy: f32 = if (rl.GetRandomValue(0, 1) == 1) -LOGO_SPEED else LOGO_SPEED;

    while (!rl.WindowShouldClose()) {
        const delta_time = rl.GetFrameTime();

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

        if (x < 0 or x + @as(f32, @floatFromInt(logo_texture.width)) >= WINDOW_WIDTH - 1) {
            dx *= -1;
            x += dx * delta_time;
        }
        if (y < 0 or y + @as(f32, @floatFromInt(logo_texture.height)) >= WINDOW_HEIGHT - 1) {
            dy *= -1;
            y += dy * delta_time;
        }

        rl.BeginDrawing();
        rl.ClearBackground(BLACK);
        rl.DrawTextureV(logo_texture, rl.Vector2{ .x = x, .y = y }, WHITE);
        rl.EndDrawing();
    }

    rl.UnloadTexture(logo_texture);
    rl.CloseWindow();
}
