const rl = @import("raylib");

pub fn main() anyerror!void {
    // Initialization
    //--------------------------------------------------------------------------------------
    const screenWidth = 800;
    const screenHeight = 450;

    rl.initWindow(screenWidth, screenHeight, "raylib-zig [shapes] example - raylib logo animation");
    defer rl.closeWindow(); // Close window and OpenGL context

    const logoPositionX = (screenWidth / 2) - 128;
    const logoPositionY = (screenHeight / 2) - 128;

    var framesCounter: u8 = 0;
    var lettersCount: u8 = 0;

    var topSideRecWidth: i32 = 16;
    var leftSideRecHeight: i32 = 16;

    var bottomSideRecWidth: i32 = 16;
    var rightSideRecHeight: i32 = 16;

    var state: u8 = 0;
    var alpha: f32 = 1.0;

    rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
    //--------------------------------------------------------------------------------------

    // Main game loop
    while (!rl.windowShouldClose()) { // Detect window close button or ESC key
        // Update
        //----------------------------------------------------------------------------------
        if (state == 0) {
            framesCounter += 1;
            if (framesCounter == 120) {
                state = 1;
                framesCounter = 0;
            }
        } else if (state == 1) {
            topSideRecWidth += 4;
            leftSideRecHeight += 4;

            if (topSideRecWidth == 256) state = 2;
        } else if (state == 2) // State 2: Bottom and right bars growing
        {
            bottomSideRecWidth += 4;
            rightSideRecHeight += 4;

            if (bottomSideRecWidth == 256) state = 3;
        } else if (state == 3) // State 3: Letters appearing (one by one)
        {
            framesCounter += 1;

            if (@mod(framesCounter, 12) == 0) // Every 12 frames, one more letter!
            {
                lettersCount += 1;
                framesCounter = 0;
            }

            if (lettersCount >= 10) // When all letters have appeared, just fade out everything
            {
                alpha -= 0.02;

                if (alpha <= 0.0) {
                    alpha = 0.0;
                    state = 4;
                }
            }
        } else if (state == 4) // State 4: Reset and Replay
        {
            if (rl.isKeyPressed(.r)) {
                framesCounter = 0;
                lettersCount = 0;

                topSideRecWidth = 16;
                leftSideRecHeight = 16;

                bottomSideRecWidth = 16;
                rightSideRecHeight = 16;

                alpha = 1.0;
                state = 0; // Return to State 0
            }
        }
        //----------------------------------------------------------------------------------

        // Draw
        //----------------------------------------------------------------------------------
        rl.beginDrawing();
        defer rl.endDrawing();

        rl.clearBackground(rl.Color.ray_white);

        if (state == 0) {
            if (@mod(framesCounter, @as(u8, 15)) == 0) rl.drawRectangle(logoPositionX, logoPositionY, 16, 16, rl.Color.black);
        } else if (state == 1) {
            rl.drawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, rl.Color.black);
            rl.drawRectangle(logoPositionX, logoPositionY, 16, leftSideRecHeight, rl.Color.black);
        } else if (state == 2) {
            rl.drawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, rl.Color.black);
            rl.drawRectangle(logoPositionX, logoPositionY, 16, leftSideRecHeight, rl.Color.black);

            rl.drawRectangle(logoPositionX + 240, logoPositionY, 16, rightSideRecHeight, rl.Color.black);
            rl.drawRectangle(logoPositionX, logoPositionY + 240, bottomSideRecWidth, 16, rl.Color.black);
        } else if (state == 3) {
            rl.drawRectangle(logoPositionX, logoPositionY, topSideRecWidth, 16, rl.fade(rl.Color.black, alpha));
            rl.drawRectangle(logoPositionX, logoPositionY + 16, 16, leftSideRecHeight - 32, rl.fade(rl.Color.black, alpha));

            rl.drawRectangle(logoPositionX + 240, logoPositionY + 16, 16, rightSideRecHeight - 32, rl.fade(rl.Color.black, alpha));
            rl.drawRectangle(logoPositionX, logoPositionY + 240, bottomSideRecWidth, 16, rl.fade(rl.Color.black, alpha));

            rl.drawRectangle(
                (@divFloor(rl.getScreenWidth(), @as(i32, 2))) - 112,
                (@divFloor(rl.getScreenHeight(), @as(i32, 2))) - 112,
                224,
                224,
                rl.fade(rl.Color.ray_white, alpha),
            );

            rl.drawText(rl.textSubtext("raylib", 0, lettersCount), @divFloor(rl.getScreenWidth(), @as(i32, 2)) - 44, @divFloor(rl.getScreenHeight(), @as(i32, 2)) + 48, 50, rl.fade(rl.Color.black, alpha));
        } else if (state == 4) {
            rl.drawText("[R] REPLAY", 340, 200, 20, rl.Color.gray);
        }

        //----------------------------------------------------------------------------------
    }
}
