package main

import "testing"

// TestRouteLayer0 is the heuristic golden set (RU+EN). The critical property is the
// safe floor: anything substantive must land on grok_direct, and a long message that
// merely starts with a greeting must NOT be trivial (no leaking real questions to the
// cheap model, §8.6).
func TestRouteLayer0(t *testing.T) {
	cases := []struct {
		body string
		want string
	}{
		// trivial: short greetings/acks and bare arithmetic
		{"привет", routeTrivial},
		{"Привет!", routeTrivial},
		{"спасибо", routeTrivial},
		{"спс", routeTrivial},
		{"ок", routeTrivial},
		{"hi", routeTrivial},
		{"hello", routeTrivial},
		{"thanks", routeTrivial},
		{"thank you", routeTrivial},
		{"ok", routeTrivial},
		{"2+2", routeTrivial},
		{"100 * 50", routeTrivial},
		{"12 / 4 - 1", routeTrivial},
		// web: freshness signals
		{"какие новости сегодня?", routeWebThenGrok},
		{"что сейчас происходит в мире", routeWebThenGrok},
		{"курс доллара сегодня", routeWebThenGrok},
		{"what's the weather today", routeWebThenGrok},
		{"latest news on AI", routeWebThenGrok},
		{"current bitcoin price", routeWebThenGrok},
		// grok_direct: substantive (the safe floor)
		{"посоветуй фильм на вечер", routeGrokDirect},
		{"explain how TCP works", routeGrokDirect},
		{"расскажи историю римской империи", routeGrokDirect},
		{"спасибо, а теперь подробно объясни квантовую запутанность", routeGrokDirect}, // starts w/ ack but long
		{"hi, can you help me debug this Go program?", routeGrokDirect},                // starts w/ hi but a real ask
		{"напиши функцию сортировки на python", routeGrokDirect},
	}
	for _, c := range cases {
		if got := routeLayer0(c.body).Route; got != c.want {
			t.Errorf("routeLayer0(%q) = %q, want %q", c.body, got, c.want)
		}
	}
}

func TestExtractJSON(t *testing.T) {
	if got := extractJSON("prefix {\"route\":\"web\"} suffix"); got != `{"route":"web"}` {
		t.Errorf("extractJSON = %q", got)
	}
	if got := extractJSON("no json here"); got != "" {
		t.Errorf("extractJSON(no json) = %q, want empty", got)
	}
}

func TestContainsTrigger(t *testing.T) {
	if !containsTrigger("ну подумай глубже про это", "подумай глубже") {
		t.Error("should match trigger phrase mid-sentence")
	}
	if containsTrigger("just a normal question", "подумай глубже") {
		t.Error("must not match when phrase absent")
	}
	if containsTrigger("anything", "") {
		t.Error("empty trigger must never match")
	}
}
