module main

import os
import gg
import gx
import math

@[heap]
pub struct Window {
pub mut:
	ctx   &gg.Context = unsafe { 0 }
	image gg.Image
}

pub fn (mut window Window) init() {
	logo_path := os.resource_abs_path(os.join_path('..', 'assets', 'logo.png'))
	window.image = window.ctx.create_image(logo_path) or { panic(err) }
}

pub fn (mut window Window) draw(_ voidptr) {
	window.ctx.begin()

	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: 400 - window.image.width / 2
			y: 300 - window.image.height / 2
			width: window.image.width
			height: window.image.height
		}
		// effect: .alpha <-- this can be omitted completely as it is alpha by default.
	)

	// Red
	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: (400 - window.image.width / 2) + f32(math.sin(f32(window.ctx.frame) / 10.0) * 60)
			y: (300 - window.image.height / 2) + f32(math.cos(f32(window.ctx.frame) / 10.0) * 60)
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{255, 0, 0, 255}
		effect: .add
	)

	// Green
	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: (400 - window.image.width / 2) + f32(math.sin(f32(window.ctx.frame) / 10.0) * 80)
			y: (300 - window.image.height / 2) + f32(math.cos(f32(window.ctx.frame) / 10.0) * 80)
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{0, 255, 0, 255}
		effect: .add
	)

	// Blue
	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: (400 - window.image.width / 2) + f32(math.sin(f32(window.ctx.frame) / 10.0) * 100)
			y: (300 - window.image.height / 2) + f32(math.cos(f32(window.ctx.frame) / 10.0) * 100)
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{0, 0, 255, 255}
		effect: .add
	)

	// More examples
	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: 50
			y: 0
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{255, 0, 0, 255}
		effect: .add
	)

	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: 50
			y: 50
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{0, 255, 0, 255}
		effect: .add
	)

	window.ctx.draw_image_with_config(
		img: &window.image
		img_id: window.image.id
		img_rect: gg.Rect{
			x: 50
			y: 100
			width: window.image.width
			height: window.image.height
		}
		color: gx.Color{0, 0, 255, 255}
		effect: .add
	)

	window.ctx.end()
}

fn main() {
	mut window := &Window{}

	window.ctx = gg.new_context(
		width: 800
		height: 600
		user_data: window
		bg_color: gx.gray
		// FNs
		init_fn: window.init
		frame_fn: window.draw
	)

	window.ctx.run()
}
