\enum MyEnum {
\	EnumItem1,
\	EnumItem2 = 1,
\	EnumItem3,
\	EnumItem4,
\}
\
\enum MyTypedEnum : i8 {
\	EnumItem1,
\	EnumItem2,
\	EnumItem3 = 105,
\	EnumItem4,
\}

struct Vec2 {
	x y: f32,
}

struct Rect {
	pos size: Vec2,
}

let CONSTPOS :: .Vec2 {20.0 20.0}
let CONSTSZ :: .Vec2 {100.0 100.0}
let CONST :: .Rect {(CONSTPOS) (CONSTSZ)}

\ FIXME: LLVM IR geneartion is borked
\ let CONST :: .Rect { .Vec2 { 20.0 20.0 } .Vec2 { 100.0 100.0 } }

struct Color {
	r g b a: u8,
}

let KEY_R :: 82

fn InitWindow(w h: i32, title: []u8)
fn CloseWindow
fn BeginDrawing
fn SetTargetFPS(fps: i32)
fn EndDrawing
fn DrawFPS(x y: i32)
fn WindowShouldClose i32
fn TextSubtext(text: []u8, start end: i32) []u8
fn IsKeyPressed(key: i32) u1

struct Rectangle {
	x y w h: f32,
}

fn ColorToRaylib(c: Color) u32 {
	ret c.a as u32 << 24 as u32 | c.b as u32 << 16 as u32 | c.g as u32 << 8 as u32 | c.r
}

fn ClearBackgroundWrap(c: Color) {
	fn ClearBackground(c: u32)
	ClearBackground (ColorToRaylib c)
}

fn DrawRectangleWrap(x y w h: i32, c: Color) {
	fn DrawRectangle(x y w h: i32, c: u32)
	DrawRectangle x y w h (ColorToRaylib c)
}

fn DrawCircleWrap(x y: i32, r: f32, c: Color) {
	fn DrawCircle(x y: i32, r: f32, c: u32)
	DrawCircle x y r (ColorToRaylib c)
}

fn DrawRectangleRecWrap(r: Rectangle, c: Color) {
	fn DrawRectangleRec(r: Rectangle, c: u32)
	DrawRectangleRec r (ColorToRaylib c)
}

fn DrawTextWrap(text: []u8, x y size: i32, c: Color) {
	fn DrawText(text: []u8, x y size: i32, c: u32)
	DrawText text x y size (ColorToRaylib c)
}

let WHITE :: .Color {255 255 255 255}
let BLACK :: .Color {0 0 0 255}
let RED   :: .Color {255 0 0 255}
let BLUE  :: .Color {0 0 255 255}

InitWindow 800 450 Raylib
SetTargetFPS 60

fn GetScreenWidth i32
fn GetScreenHeight i32

fn DrawRect(rect: Rect, c: Color) {
	DrawRectangleWrap (rect.pos.x as i32) (rect.pos.y as i32) (rect.size.x as i32) (rect.size.y as i32) c
}

let logox := GetScreenWidth / 2 - 128
let logoy := GetScreenHeight / 2 - 128

\ FIXME: Cannot inline
let fc := 0
let lc := 0
let top_side_rec_width := 16
let left_side_rec_height := 16
let bottom_side_rec_width := 16
let right_side_rec_height := 16

let state := 0
let alpha := 1.0

for WindowShouldClose == 0 {
	if state == 0 {
		if ++fc == 120 {
			state = 1
			fc = 0
		}
	} elif state == 1 {
		top_side_rec_width = top_side_rec_width + 4
		left_side_rec_height = left_side_rec_height + 4

		if top_side_rec_width == 256 {
			state = 2
		}
	} elif state == 2 {
		bottom_side_rec_width = bottom_side_rec_width + 4
		right_side_rec_height = right_side_rec_height + 4

		if bottom_side_rec_width == 256 {
			state = 3
		}
	} elif state == 3 {
		if ++fc / 12 != 0 {
			++lc
			fc = 0
		}

		if lc >= 10 {
			alpha = alpha - 0.01
			if alpha <= 0.0 {
				alpha = 0.0
				state = 4
			}
		}
	} elif IsKeyPressed(KEY_R) { \ 
		fc = lc = 0
		
		top_side_rec_width = 16
		left_side_rec_height = 16
		bottom_side_rec_width = 16
		right_side_rec_height = 16

		state = 0
		alpha = 1.0
	}

	BeginDrawing
	ClearBackgroundWrap WHITE
	DrawFPS 20 20

	DrawRect CONST RED

	if state == 0 {
		if (fc/15)%2 != 0 {
			DrawRectangleWrap logox logoy 16 16 BLACK
		}
	} elif state == 1 {
		DrawRectangleWrap logox logoy top_side_rec_width 16 BLACK
		DrawRectangleWrap logox logoy 16 left_side_rec_height BLACK
	} elif state == 2 {
		DrawRectangleWrap logox logoy top_side_rec_width 16 BLACK
		DrawRectangleWrap logox logoy 16 left_side_rec_height BLACK

		DrawRectangleWrap logox+240 logoy 16 right_side_rec_height BLACK
		DrawRectangleWrap logox logoy+240 bottom_side_rec_width 16 BLACK
	} elif state == 3 {
		let colorw := .Color{255 255 255 (alpha*255.0) as u8}
		let colorb := .Color{0 0 0 (alpha*255.0) as u8}
		\ FIXME: ADD field access assignment
		\color.a = (alpha * 255.0) as u8
		DrawRectangleWrap logox logoy top_side_rec_width 16 colorb
		DrawRectangleWrap logox logoy+16 16 left_side_rec_height-32 colorb

		DrawRectangleWrap logox+240 logoy+16 16 right_side_rec_height-32 cbolor
		DrawRectangleWrap logox logoy+240 bottom_side_rec_width 16 colorb

		DrawRectangleWrap GetScreenWidth/2-112 GetScreenHeight/2-112 224 224 colorw

		DrawTextWrap (TextSubtext raylib 0 lc) GetScreenWidth/2-44 GetScreenHeight/2+48 50 colorb
	} else {
		DrawTextWrap "[R] REPLAY" 340 200 20 BLACK
	}

	EndDrawing
}
CloseWindow

