package collector

import "testing"

func TestParsePSUSDR(t *testing.T) {
	raw := `
PS1 Input Power   | 215 Watts | ok
PS1 Output Power  | 198 Watts | ok
PS1 Input Voltage | 229 Volts | ok
PS1 Temp         | 39 C      | ok
PS1 Health       | 97 %      | ok
PS2 Input Power   | 0 Watts   | cr
`

	got := parsePSUSDR(raw)
	if len(got) != 2 {
		t.Fatalf("len(got)=%d want 2", len(got))
	}
	if got[1].status != statusOK {
		t.Fatalf("ps1 status=%q", got[1].status)
	}
	if got[1].inputPowerW == nil || *got[1].inputPowerW != 215 {
		t.Fatalf("ps1 input power=%v", got[1].inputPowerW)
	}
	if got[1].outputPowerW == nil || *got[1].outputPowerW != 198 {
		t.Fatalf("ps1 output power=%v", got[1].outputPowerW)
	}
	if got[1].inputVoltage == nil || *got[1].inputVoltage != 229 {
		t.Fatalf("ps1 input voltage=%v", got[1].inputVoltage)
	}
	if got[1].temperatureC == nil || *got[1].temperatureC != 39 {
		t.Fatalf("ps1 temperature=%v", got[1].temperatureC)
	}
	if got[1].healthPct == nil || *got[1].healthPct != 97 {
		t.Fatalf("ps1 health=%v", got[1].healthPct)
	}
	if got[2].status != statusCritical {
		t.Fatalf("ps2 status=%q", got[2].status)
	}
}

func TestParsePSUSlotVendorVariants(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name string
		want int
	}{
		{name: "PWS1 Status", want: 1},
		{name: "Power Supply Bay 8", want: 8},
		{name: "PS 6 Input Power", want: 6},
	}

	for _, tt := range tests {
		got, ok := parsePSUSlot(tt.name)
		if !ok || got != tt.want {
			t.Fatalf("parsePSUSlot(%q)=(%d,%v) want (%d,true)", tt.name, got, ok, tt.want)
		}
	}
}

func TestSynthesizePSUsFromSDR(t *testing.T) {
	t.Parallel()

	health := 97.0
	outputPower := 915.0
	got := synthesizePSUsFromSDR(map[int]psuSDR{
		1: {
			slot:         1,
			status:       statusOK,
			outputPowerW: &outputPower,
			healthPct:    &health,
		},
	})

	if len(got) != 1 {
		t.Fatalf("len(got)=%d want 1", len(got))
	}
	if got[0].Slot == nil || *got[0].Slot != "0" {
		t.Fatalf("slot=%v want 0", got[0].Slot)
	}
	if got[0].OutputPowerW == nil || *got[0].OutputPowerW != 915 {
		t.Fatalf("output power=%v", got[0].OutputPowerW)
	}
	if got[0].LifeRemainingPct == nil || *got[0].LifeRemainingPct != 97 {
		t.Fatalf("life remaining=%v", got[0].LifeRemainingPct)
	}
	if got[0].LifeUsedPct == nil || *got[0].LifeUsedPct != 3 {
		t.Fatalf("life used=%v", got[0].LifeUsedPct)
	}
}
