package karl2d

import "base:runtime"

Window_Interface :: struct #all_or_none {
	state_size: proc() -> int,
	init: proc(window_state: rawptr, window_width: int, window_height: int, window_title: string, 
	           flags: Window_Flags, allocator: runtime.Allocator),
	shutdown: proc(),
	window_handle: proc() -> Window_Handle,
	process_events: proc(),
	get_events: proc() -> []Window_Event,
	clear_events: proc(),
	set_position: proc(x: int, y: int),
	set_size: proc(w, h: int),
	get_width: proc() -> int,
	get_height: proc() -> int,
	get_window_scale: proc() -> f32,
	set_flags: proc(flags: Window_Flags),

	is_gamepad_active: proc(gamepad: int) -> bool,
	get_gamepad_axis: proc(gamepad: int, axis: Gamepad_Axis) -> f32,
	set_gamepad_vibration: proc(gamepad: int, left: f32, right: f32),

	set_internal_state: proc(state: rawptr),
}

Window_Handle :: distinct uintptr

Window_Event :: union {
	Window_Event_Close_Wanted,
	Window_Event_Key_Went_Down,
	Window_Event_Key_Went_Up,
	Window_Event_Mouse_Move,
	Window_Event_Mouse_Wheel,
	Window_Event_Resize,
	Window_Event_Mouse_Button_Went_Down,
	Window_Event_Mouse_Button_Went_Up,
	Window_Event_Gamepad_Button_Went_Down,
	Window_Event_Gamepad_Button_Went_Up,
}

Window_Event_Key_Went_Down :: struct {
	key: Keyboard_Key,
}

Window_Event_Key_Went_Up :: struct {
	key: Keyboard_Key,
}

Window_Event_Mouse_Button_Went_Down :: struct {
	button: Mouse_Button,
}

Window_Event_Mouse_Button_Went_Up :: struct {
	button: Mouse_Button,
}

Window_Event_Gamepad_Button_Went_Down :: struct {
	gamepad: int,
	button: Gamepad_Button,
}

Window_Event_Gamepad_Button_Went_Up :: struct {
	gamepad: int,
	button: Gamepad_Button,
}

Window_Event_Close_Wanted :: struct {}

Window_Event_Mouse_Move :: struct {
	position: Vec2,
}

Window_Event_Mouse_Wheel :: struct {
	delta: f32,
}

Window_Event_Resize :: struct {
	width, height: int,
}