package confmgr

import "testing"

func TestEvaluateRule_Valid(t *testing.T) {
	src := `
current_limit: >=0 & <=max
max: 100
`
	res := EvaluateRule(src, map[string]any{"current_limit": 50.0})
	if !res.OK {
		t.Fatalf("expected OK, got violations: %+v compile=%q", res.Violations, res.CompileError)
	}
	if res.CompileError != "" {
		t.Fatalf("unexpected compile error: %s", res.CompileError)
	}
}

func TestEvaluateRule_Violation(t *testing.T) {
	src := `current_limit: >=0 & <=100`
	res := EvaluateRule(src, map[string]any{"current_limit": 150.0})
	if res.OK {
		t.Fatalf("expected violation, got OK")
	}
	if len(res.Violations) == 0 {
		t.Fatalf("expected at least one violation")
	}
}

func TestEvaluateRule_Transform(t *testing.T) {
	// power is derived from the supplied current & voltage.
	src := `
current: number
voltage: number
power: current * voltage
`
	res := EvaluateRule(src, map[string]any{"current": 2.0, "voltage": 3.0})
	if !res.OK {
		t.Fatalf("expected OK, got %+v", res.Violations)
	}
	got, ok := res.Transformed["power"]
	if !ok {
		t.Fatalf("expected transformed power, got %+v", res.Transformed)
	}
	if f, _ := toFloat(got); f != 6 {
		t.Fatalf("expected power=6, got %v", got)
	}
}

func TestEvaluateRule_DefaultFillsMissing(t *testing.T) {
	src := `mode: *"auto" | "manual"`
	res := EvaluateRule(src, map[string]any{})
	if !res.OK {
		t.Fatalf("expected OK, got %+v", res.Violations)
	}
	if res.Transformed["mode"] != "auto" {
		t.Fatalf("expected mode default auto, got %v", res.Transformed["mode"])
	}
}

func TestEvaluateRule_CompileError(t *testing.T) {
	res := EvaluateRule(`this is : : not cue`, map[string]any{})
	if res.OK || res.CompileError == "" {
		t.Fatalf("expected compile error, got %+v", res)
	}
}

func TestConfigRule_Validate(t *testing.T) {
	r := ConfigRule{Name: "r", SetID: "s", Source: `x: >=0`}
	if err := r.Validate(); err != nil {
		t.Fatalf("expected valid rule, got %v", err)
	}
	bad := ConfigRule{Name: "r", SetID: "s", Source: `x: : :`}
	if err := bad.Validate(); err == nil {
		t.Fatalf("expected compile error for bad source")
	}
	if err := (ConfigRule{Source: `x: 1`}).Validate(); err == nil {
		t.Fatalf("expected error for missing name/setID")
	}
}
