package rigctld

import (
	"strings"
	"testing"
)

// WSJT-X in "Split Operating: Rig" sends set_split_vfo then set_split_freq. Both
// used to answer RPRT 0 and do NOTHING: the software believed it was
// transmitting up the band while the radio stayed on the receive frequency —
// on a pileup, straight onto the DX, with no trace anywhere.
func TestSetSplitReachesTheRig(t *testing.T) {
	rig := &fakeRig{freq: 14074000, mode: "FT8"}
	s := New(0, rig, func(string, ...any) {})

	if got, _ := s.handle("S 1 VFOB"); !strings.HasPrefix(got, "RPRT 0") {
		t.Fatalf("set_split_vfo answered %q", got)
	}
	// Arming alone must NOT touch the rig: without a frequency it would transmit
	// on whatever the second VFO happened to hold.
	if len(rig.splitCalls) != 0 {
		t.Errorf("split was armed before a frequency arrived: %v", rig.splitCalls)
	}

	if got, _ := s.handle("I 14075300.000000"); !strings.HasPrefix(got, "RPRT 0") {
		t.Fatalf("set_split_freq answered %q", got)
	}
	if len(rig.splitCalls) != 1 || rig.splitCalls[0] != "true:14075300" {
		t.Fatalf("rig saw %v, want one call arming split on 14075300", rig.splitCalls)
	}

	if got, _ := s.handle("S 0 VFOA"); !strings.HasPrefix(got, "RPRT 0") {
		t.Fatalf("split off answered %q", got)
	}
	if len(rig.splitCalls) != 2 || !strings.HasPrefix(rig.splitCalls[1], "false:") {
		t.Errorf("rig saw %v, want split cleared", rig.splitCalls)
	}
}

// A backend that cannot do split must produce an ERROR the client can report.
// Answering success and doing nothing is what caused the original fault, and it
// is the one outcome that must never come back.
func TestSetSplitRefusalIsReported(t *testing.T) {
	rig := &fakeRig{freq: 14074000, noSplit: true}
	s := New(0, rig, func(string, ...any) {})

	s.handle("S 1 VFOB")
	got, _ := s.handle("I 14075300.000000")
	if strings.HasPrefix(got, "RPRT 0") {
		t.Errorf("a rig that cannot split answered %q — the client will transmit on the wrong frequency", got)
	}
}
