package main

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

DEFAULT_DB_PATH :: "~/.local/share/data-goblin/goblin.db"

run_app :: proc() -> bool {
	if len(os.args) < 2 {
		command_usage(os.args[:1])
		return true
	}

	store: Storage
	if err := storage_open(&store, "data.db"); err != nil {
		fmt.eprintf("run_app: storage.open error -> %v\n", err)
		return false
	}

	if err := storage_ensure_schema(&store); err != nil {
		fmt.eprintf("run_app: storage.ensure_schema error -> %v\n", err)
		return false
	}

	cmd := command_from_string(os.args[1])
	cmd_data := Command_Data[cmd]
	cmd_data.func(os.args[1:])

	if err := storage_close(&store); err != nil {
		fmt.eprintf("run_app: storage.close error -> %v\n", err)
		return false
	}

	return true
}

main :: proc() {
	when ODIN_DEBUG {
		track: mem.Tracking_Allocator
		mem.tracking_allocator_init(&track, context.allocator)
		context.allocator = mem.tracking_allocator(&track)

		defer {
			for _, leak in track.allocation_map {
				fmt.printf("%v leaked %m\n", leak.location, leak.size)
			}
			mem.tracking_allocator_destroy(&track)
		}
	}

	if !run_app() {
		fmt.eprintf("internal error\n")
	}

	free_all(context.temp_allocator)

	fmt.printf("BYE\n")
}