package main

import "core:bytes"
import "core:fmt"
import "core:io"
import "core:os"
import "core:time"

main :: proc() {
	if len(os.args) < 2 {
		panic("no file")
	}

	filepath := os.args[1]
	file, err := os.open(filepath)
	if err != os.ERROR_NONE {
		panic("could not open file")
	}
	defer os.close(file)

	fmt.printf("%s\n", filepath)
	reader: io.Reader
	seeker: io.Seeker
	ok: bool
	reader, ok = io.to_reader(os.stream_from_handle(file))
	if !ok {
		panic("could not reader")
	}
	seeker, ok = io.to_seeker(os.stream_from_handle(file))
	if !ok {
		panic("could not seeker")
	}

	body_length: u32
	{
		io.read_ptr(reader, &body_length, 4)
		fmt.printf("body_length: %d\n", body_length)
	}
	file_length: u32
	{
		io.read_ptr(reader, &file_length, 4)
		fmt.printf("file_length: %d\n", file_length)
	}

	index_length := file_length - body_length
	fmt.printf("index_length: %d\n", index_length)
	content_marks := make([]u32, index_length)
	for i in 0 ..< index_length {
		io.read_ptr(reader, &content_marks[i], 4)
	}
	// fmt.printf("%v#%d\n", content_marks, len(content_marks))
	fmt.printf("#%d marks\n", len(content_marks))

	content_offset := 8 + (index_length * 4)
	io.seek(seeker, i64(content_offset), .Start)

	buffer: [4096]byte
	prev_mark: u32
	for mark in content_marks {
		length := mark - prev_mark
		line := buffer[:length]
		fmt.printf("\nblock %d-%d\n", prev_mark, mark)

		io.read_full(reader, line)
		/*for c in line {
			fmt.printf("%c", c)
		}
		fmt.printf("\n")*/

		buffer: bytes.Buffer
		bytes.buffer_init(&buffer, line)
		defer bytes.buffer_destroy(&buffer)

		{
			timestamp: u32
			bytes.buffer_read_ptr(&buffer, ×tamp, 4)
			filter, _ := bytes.buffer_read_byte(&buffer)
			channel, _ := bytes.buffer_read_byte(&buffer)

			unix_time := time.unix(i64(timestamp), 0)
			fmt.printf(
				"%d - %d/%02d/%02d@%02d:%02d:%02d - %x %x\n",
				timestamp,
				time.date(unix_time),
				time.clock_from_time(unix_time),
				filter,
				channel,
			)
		}

		for bytes.buffer_length(&buffer) > 0 {
			b, _ := bytes.buffer_read_byte(&buffer)
			if b == 0x02 {
				fmt.printf("[")

				kind, _ := bytes.buffer_read_byte(&buffer)
				fmt.printf("0x%02x=", kind)
				size, _ := bytes.buffer_read_byte(&buffer)
				fmt.printf("%d, ", size)

				for _ in 0 ..< size {
					b, _ = bytes.buffer_read_byte(&buffer)
					if b >= 32 && b <= 126 {
						fmt.printf("%c", b)
					} else {
						if b == 0x03 {
							fmt.printf("]")
						} else {
							fmt.printf("0x%02x ", b)
						}
					}
				}
			} else {
				// fmt.printf("(0x%02x) %c ", b, b)
				fmt.printf("%c", b)
			}
		}
		fmt.printf("\n")

		prev_mark = mark
	}
}