package main

import "core:fmt"
import "core:math"
import "core:strings"
import "huginn:core/ui"
import rl "vendor:raylib"

main :: proc() {
	rl.InitWindow(1024, 768, "Odin UI v2")
	rl.SetTargetFPS(60)
	rl.SetWindowState({.WINDOW_RESIZABLE})

	ctx: ui.Context
	ui.init(&ctx)

	bg_color := rl.Color{30, 30, 30, 255}

	// Демо-данные
	checked := false
	volume: f32 = 50

	for !rl.WindowShouldClose() {
		// --- 1. Input ---
		input: ui.Input
		input.mouse_pos = {f32(rl.GetMouseX()), f32(rl.GetMouseY())}
		// Важно: передаем дельту мыши для драга и ресайза
		input.mouse_delta = {rl.GetMouseDelta().x, rl.GetMouseDelta().y}
		input.mouse_down = rl.IsMouseButtonDown(.LEFT)
		input.mouse_pressed = rl.IsMouseButtonPressed(.LEFT)

		input.measure_text = proc(text: string) -> f32 {
			return f32(rl.MeasureText(strings.clone_to_cstring(text, context.temp_allocator), 20))
		}

		// --- 2. UI Logic ---
		ui.begin(&ctx, input)

		// Окно 1
		if ui.window(&ctx, "Demo Window", {50, 50, 300, 400}) {
			ui.label(&ctx, "Try dragging this window!")

			// Длинный текст для теста обрезки
			ui.label(
				&ctx,
				"This is a very long text label that should be truncated if the window is too small.",
			)

			@(static) counter: u32 = 0
			ui.label(&ctx, fmt.tprintf("{}", counter))
			counter += 1


			ui.row(&ctx, {100, -1})
			if ui.button(&ctx, "Button A") {fmt.println("A")}
			if ui.button(&ctx, "Button B") {fmt.println("B")}

			ui.row(&ctx, {-1})
			if ui.button(&ctx, "Wide Button") {fmt.println("Wide")}

			ui.label(&ctx, "Adaptive Flow:")

			// ИСПОЛЬЗУЕМ FLOW ВМЕСТО ROW
			// Кнопки будут идти в ряд, пока влезают, потом перенесутся
			ui.flow(&ctx)
			if ui.button(&ctx, "Gray Color") {bg_color = {30, 30, 30, 255}}
			if ui.button(&ctx, "Red Color") {bg_color = {60, 20, 20, 255}}
			if ui.button(&ctx, "Blue Color") {bg_color = {20, 20, 60, 255}}
			if ui.button(&ctx, "Green") {bg_color = {20, 60, 20, 255}}
			if ui.button(&ctx, "Yellow") {bg_color = {60, 60, 20, 255}}

			ui.window_end(&ctx)
		}

		// Окно 2
		@(static) is_open: bool = true
		if ui.window(&ctx, "Another One", {400, 100, 200, 150}) {
			ui.label(&ctx, "I am independent.")
			if ui.button(&ctx, "Close Me") {
				is_open = false
				fmt.println("Close clicked")
			}
			ui.window_end(&ctx)
		}

		ui.end(&ctx)

		// --- 3. Render ---
		rl.BeginDrawing()
		rl.ClearBackground(bg_color)

		for cmd in ctx.commands {
			switch c in cmd {
			case ui.Cmd_Rect:
				rl.DrawRectangleRec(
					{c.rect.x, c.rect.y, c.rect.w, c.rect.h},
					transmute(rl.Color)c.color,
				)
			case ui.Cmd_Text:
				rl.DrawText(
					strings.clone_to_cstring(c.text, context.temp_allocator),
					i32(c.pos.x),
					i32(c.pos.y),
					20,
					transmute(rl.Color)c.color,
				)
			case ui.Cmd_Clip:
				if c.is_actived {
					// Raylib ScissorMode работает в экранных координатах,
					// а наши Rect тоже экранные, так что конвертация простая.
					// Важно: Scissor не может иметь отрицательные размеры.
					w := i32(math.max(0, c.rect.w))
					h := i32(math.max(0, c.rect.h))
					rl.BeginScissorMode(i32(c.rect.x), i32(c.rect.y), w, h)
				} else {
					rl.EndScissorMode()
				}
			}
		}

		rl.EndDrawing()
		free_all(context.temp_allocator)
	}

	rl.CloseWindow()
}
