package examples

import "core:fmt"
import "core:log"
import "core:mem"
import "core:os"

EX_HELLOPE_SHAPES :: "hellope-shapes"
EX_HELLOPE_TEXT :: "hellope-text"
EX_HELLOPE_CLAY :: "hellope-clay"
EX_HELLOPE_CUSTOM :: "hellope-custom"
EX_TEXTURES :: "textures"
EX_GAUSSIAN_BLUR :: "gaussian-blur"
EX_GAUSSIAN_BLUR_DEBUG :: "gaussian-blur-debug"

AVAILABLE_EXAMPLES_MSG ::
	"Available examples: " +
	EX_HELLOPE_SHAPES +
	", " +
	EX_HELLOPE_TEXT +
	", " +
	EX_HELLOPE_CLAY +
	", " +
	EX_HELLOPE_CUSTOM +
	", " +
	EX_TEXTURES +
	", " +
	EX_GAUSSIAN_BLUR +
	", " +
	EX_GAUSSIAN_BLUR_DEBUG

main :: proc() {
	//----- General setup ----------------------------------
	// Temp
	track_temp: mem.Tracking_Allocator
	mem.tracking_allocator_init(&track_temp, context.temp_allocator)
	context.temp_allocator = mem.tracking_allocator(&track_temp)

	// Default
	track: mem.Tracking_Allocator
	mem.tracking_allocator_init(&track, context.allocator)
	context.allocator = mem.tracking_allocator(&track)
	// Log a warning about any memory that was not freed by the end of the program.
	// This could be fine for some global state or it could be a memory leak.
	defer {
		// Temp allocator
		if len(track_temp.bad_free_array) > 0 {
			fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array))
			for entry in track_temp.bad_free_array {
				fmt.eprintf("- %p @ %v\n", entry.memory, entry.location)
			}
			mem.tracking_allocator_destroy(&track_temp)
		}
		// Default allocator
		if len(track.allocation_map) > 0 {
			fmt.eprintf("=== %v allocations not freed - main allocator: ===\n", len(track.allocation_map))
			for _, entry in track.allocation_map {
				fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location)
			}
		}
		if len(track.bad_free_array) > 0 {
			fmt.eprintf("=== %v incorrect frees - main allocator: ===\n", len(track.bad_free_array))
			for entry in track.bad_free_array {
				fmt.eprintf("- %p @ %v\n", entry.memory, entry.location)
			}
		}
		mem.tracking_allocator_destroy(&track)
	}
	context.logger = log.create_console_logger()
	defer log.destroy_console_logger(context.logger)

	args := os.args
	if len(args) < 2 {
		fmt.eprintln("Usage: examples <example_name>")
		fmt.eprintln(AVAILABLE_EXAMPLES_MSG)
		os.exit(1)
	}

	switch args[1] {
	case EX_HELLOPE_CLAY: hellope_clay()
	case EX_HELLOPE_CUSTOM: hellope_custom()
	case EX_HELLOPE_SHAPES: hellope_shapes()
	case EX_HELLOPE_TEXT: hellope_text()
	case EX_TEXTURES: textures()
	case EX_GAUSSIAN_BLUR: gaussian_blur()
	case EX_GAUSSIAN_BLUR_DEBUG: gaussian_blur_debug()
	case:
		fmt.eprintf("Unknown example: %v\n", args[1])
		fmt.eprintln(AVAILABLE_EXAMPLES_MSG)
		os.exit(1)
	}
}
