import gg
import gx
import sokol.sapp
import sokol.sgl
import sokol.gfx
import x.ttf
import os

// import math
const (
	win_width  = 600
	win_height = 700
	bg_color   = gx.white
	font_paths = [
		os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'Imprima-Regular.ttf')),
		os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'Graduate-Regular.ttf')),
	]
)

// UI
struct App_data {
pub mut:
	gg              &gg.Context = unsafe { nil }
	sg_img          gfx.Image
	init_flag       bool
	frame_c         int
	tf              []ttf.TTF_File
	ttf_render      []ttf.TTF_render_Sokol
	text_ready_flag bool
	mouse_x         int = -1
	mouse_y         int = -1
}

fn my_init(mut app App_data) {
	app.init_flag = true
}

fn draw_frame(mut app App_data) {
	cframe_txt := 'Current Frame: ${app.frame_c}'
	app.gg.begin()
	sgl.defaults()
	sgl.matrix_mode_projection()
	sgl.ortho(0.0, f32(sapp.width()), f32(sapp.height()), 0.0, -1.0, 1.0)
	sgl.c4b(0, 0, 0, 255) // black
	// draw a line as background
	sgl.begin_line_strip()
	sgl.v2f(10, 10)
	sgl.v2f(100, 100)
	sgl.end()
	// draw text only if the app is already initialized
	if app.init_flag == true {
		sgl.begin_line_strip()
		sgl.v2f(410, 400)
		sgl.v2f(510, 400)
		sgl.end()
		// update the text
		mut txt1 := unsafe { &app.ttf_render[0] }
		if app.frame_c % 2 == 0 {
			txt1.destroy_texture()
			txt1.create_text(cframe_txt, 43)
			txt1.create_texture()
		}
		// ----- decomment if you want text rotation ----
		// txt1.bmp.angle = 3.141592 / 180 * f32(app.frame_c % 360)
		// txt1.draw_text_bmp(app.gg, 300, 350)
		// txt1.bmp.angle =  0
		txt1.draw_text_bmp(app.gg, 30, 60)
		// block test
		block_txt := "Today it is a good day!
Tomorrow I'm not so sure :(
Frame: ${app.frame_c}
But Vwill prevail for sure, V is the way!!
òàèì@ò!£$%&
"
		txt1 = unsafe { &app.ttf_render[1] }
		if app.frame_c % 2 == 0 {
			txt1.bmp.justify = false
			if (app.frame_c >> 6) % 2 == 0 {
				// txt1.align = .left
				txt1.bmp.justify = true
			}
			txt1.bmp.align = .left
			if (app.frame_c >> 6) % 3 == 0 {
				txt1.bmp.align = .right
			}
			txt1.destroy_texture()
			txt1.create_text_block(block_txt, 500, 500, 32)
			txt1.create_texture()
		}
		// decomment if want block color change
		// txt1.bmp.color = ttf.color_multiply(0xFF00FFFF, f32(app.frame_c % 255)/255.0)
		// decomment if want block rotation wanted
		// txt1.bmp.angle = 3.141592/180 * f32(app.frame_c % 45)
		txt1.draw_text_bmp(app.gg, 30 + (app.frame_c >> 1) & 0xFF, 200)
		// draw mouse position
		if app.mouse_x >= 0 {
			txt1 = unsafe { &app.ttf_render[2] }
			txt1.destroy_texture()
			txt1.create_text('${app.mouse_x},${app.mouse_y}', 25)
			txt1.create_texture()
			r := app.mouse_x % 255
			g := app.mouse_y % 255
			color := u32(r) << 24 | u32(g) << 16 | 0xFF
			txt1.bmp.color = color
			txt1.draw_text_bmp(app.gg, app.mouse_x, app.mouse_y)
		}
		app.frame_c++
	}
	app.gg.end()
}

fn my_event_manager(mut ev gg.Event, mut app App_data) {
	if ev.typ == .mouse_move {
		app.mouse_x = int(ev.mouse_x)
		app.mouse_y = int(ev.mouse_y)
	}
}

fn main() {
	mut app := &App_data{
		gg: 0
	}
	app.gg = gg.new_context(
		width: win_width
		height: win_height
		create_window: true
		window_title: 'Test TTF module'
		user_data: app
		bg_color: bg_color
		frame_fn: draw_frame
		event_fn: my_event_manager
		init_fn: my_init
	)
	// load TTF fonts
	for font_path in font_paths {
		mut tf := ttf.TTF_File{}
		tf.buf = os.read_bytes(font_path) or { panic(err) }
		println('TrueTypeFont file [${font_path}] len: ${tf.buf.len}')
		tf.init()
		println('Unit per EM: ${tf.units_per_em}')
		app.tf << tf
	}
	// TTF render 0 Frame counter
	app.ttf_render << &ttf.TTF_render_Sokol{
		bmp: &ttf.BitMap{
			tf: &app.tf[0]
			buf: unsafe { malloc_noscan(32000000) }
			buf_size: (32000000)
			color: 0xFF0000FF
			// style: .raw
			// use_font_metrics: true
		}
	}
	// TTF render 1 Text Block
	app.ttf_render << &ttf.TTF_render_Sokol{
		bmp: &ttf.BitMap{
			tf: &app.tf[1]
			// color : 0xFF0000_10
			// style: .raw
			// use_font_metrics: true
		}
	}
	// TTF mouse position render
	app.ttf_render << &ttf.TTF_render_Sokol{
		bmp: &ttf.BitMap{
			tf: &app.tf[0]
		}
	}
	// setup sokol_gfx
	app.gg.run()
}
