package knowledge

import "testing"

func TestIsTangentialToIntentWashingMachineVsHypoallergenicDetergent(t *testing.T) {
	profile := BuildIntentProfile(PatrolTagInput{
		ProductName:     "抗敏無香洗衣精",
		ProductFeatures: "完全無香、抗敏，適合敏感肌與化療族群",
		MatchTags:       []string{"無香", "抗敏", "洗衣精"},
		Pillars:         []string{"化療後衣物清潔", "無香洗衣"},
		Questions:       []string{"化療後想找不會刺激的洗衣精"},
	})
	text := "請問洗脫烘洗衣機有推薦嗎？"
	if !IsTangentialToIntent(text, profile) {
		t.Fatal("expected washing machine post to be tangential to hypoallergenic detergent intent")
	}
}

func TestIsTangentialToIntentAcceptsCorePain(t *testing.T) {
	profile := BuildIntentProfile(PatrolTagInput{
		ProductName:     "抗敏無香洗衣精",
		ProductFeatures: "完全無香、抗敏",
		MatchTags:       []string{"無香", "洗衣精"},
	})
	text := "化療後對香味很敏感，有無香洗衣精推薦嗎？"
	if IsTangentialToIntent(text, profile) {
		t.Fatal("expected core pain post to align with intent")
	}
}

func TestRescoreGraphIntentFitPenalizesTangentialNode(t *testing.T) {
	graph := Graph{
		Seed: "無香 洗衣精",
		Nodes: []Node{
			{ID: "core", Label: "化療後對香味敏感", NodeKind: "pain", Layer: 0, ProductFitScore: 92, Relation: "需要無香洗衣精"},
			{ID: "weak", Label: "洗衣機選購", NodeKind: "knowledge", Layer: 2, ProductFitScore: 72, Relation: "家電預算與容量"},
		},
		Edges: []Edge{{From: "core", To: "weak", Relation: "延伸"}},
	}
	in := PatrolTagInput{
		ProductName:     "抗敏無香洗衣精",
		ProductFeatures: "完全無香、抗敏",
		MatchTags:       []string{"無香", "洗衣精"},
		Questions:       []string{"化療後想找無香洗衣精"},
	}
	RescoreGraphIntentFit(&graph, in)
	if graph.Nodes[0].ProductFitScore < 60 {
		t.Fatalf("expected core node to stay high, got %d", graph.Nodes[0].ProductFitScore)
	}
	if graph.Nodes[1].ProductFitScore > 35 {
		t.Fatalf("expected tangential node to be penalized, got %d", graph.Nodes[1].ProductFitScore)
	}
}
