package handler

import (
	"testing"
)

func TestParseDefeatedLog(t *testing.T) {
	tests := []struct {
		msg     string
		matched bool
	}{
		{"Defeated Forest Wolf, gained 1 XP and 5 gold", true},
		{"Encountered Forest Wolf", false},
		{"Died fighting Forest Wolf", false},
		{"Defeated a Forest Wolf", true},
	}

	for _, tt := range tests {
		matched, _ := parseDefeatedLog(tt.msg)
		if matched != tt.matched {
			t.Errorf("parseDefeatedLog(%q) = %v, want %v", tt.msg, matched, tt.matched)
		}
	}
}

func TestParseGainsLog(t *testing.T) {
	tests := []struct {
		msg      string
		wantXP   int64
		wantGold int64
		wantOK   bool
	}{
		{"Defeated Forest Wolf, gained 1 XP and 5 gold", 1, 5, true},
		{"Defeated Skeleton King, gained 3 XP and 10 gold", 3, 10, true},
		{"Encountered Forest Wolf", 0, 0, false},
		{"Died fighting Forest Wolf", 0, 0, false},
	}

	for _, tt := range tests {
		xp, gold, ok := parseGainsLog(tt.msg)
		if ok != tt.wantOK || xp != tt.wantXP || gold != tt.wantGold {
			t.Errorf("parseGainsLog(%q) = (%d, %d, %v), want (%d, %d, %v)",
				tt.msg, xp, gold, ok, tt.wantXP, tt.wantGold, tt.wantOK)
		}
	}
}

func TestIsLevelUpLog(t *testing.T) {
	if !isLevelUpLog("Leveled up to 5!") {
		t.Error("expected true for level-up log")
	}
	if isLevelUpLog("Defeated a wolf") {
		t.Error("expected false for non-level-up log")
	}
}

func TestIsDeathLog(t *testing.T) {
	if !isDeathLog("Died fighting Forest Wolf") {
		t.Error("expected true for death log")
	}
	if isDeathLog("Defeated Forest Wolf") {
		t.Error("expected false for non-death log")
	}
}

func TestIsPotionLog(t *testing.T) {
	if !isPotionLog("Used healing potion, restored 30 HP") {
		t.Error("expected true for potion log")
	}
	if isPotionLog("Defeated Forest Wolf") {
		t.Error("expected false for non-potion log")
	}
}
