package helicopter

import "testing"

func TestHelicopterEnforceAOGInactive(t *testing.T) {
	cases := []struct {
		name        string
		airOnGround bool
		initActive  bool
		want        bool
	}{
		{name: "aog forces inactive", airOnGround: true, initActive: true, want: false},
		{name: "aog stays inactive", airOnGround: true, initActive: false, want: false},
		{name: "not aog keeps manual active", airOnGround: false, initActive: true, want: true},
		{name: "not aog keeps manual inactive", airOnGround: false, initActive: false, want: false},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			h := Helicopter{AirOnGround: tc.airOnGround, IsActive: tc.initActive}
			h.EnforceAOGInactive()
			if h.IsActive != tc.want {
				t.Fatalf("IsActive = %v, want %v", h.IsActive, tc.want)
			}
		})
	}
}

func TestHelicopterDeriveStatus(t *testing.T) {
	cases := []struct {
		name        string
		airOnGround bool
		mcf         bool
		isInUse     bool
		want        string
	}{
		{name: "available when idle", airOnGround: false, mcf: false, isInUse: false, want: StatusAvailable},
		{name: "booked when in use", airOnGround: false, mcf: false, isInUse: true, want: StatusBooked},
		{name: "mcf when mcf flagged", airOnGround: false, mcf: true, isInUse: false, want: StatusMCF},
		{name: "mcf outranks booked", airOnGround: false, mcf: true, isInUse: true, want: StatusMCF},
		{name: "aog when on ground", airOnGround: true, mcf: false, isInUse: false, want: StatusAOG},
		{name: "aog outranks booked", airOnGround: true, mcf: false, isInUse: true, want: StatusAOG},
		{name: "mcf outranks aog", airOnGround: true, mcf: true, isInUse: false, want: StatusMCF},
	}

	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			h := Helicopter{AirOnGround: tc.airOnGround}
			if got := h.DeriveStatus(StatusInput{IsBook: tc.isInUse, IsMCF: tc.mcf}); got != tc.want {
				t.Fatalf("DeriveStatus() = %q, want %q", got, tc.want)
			}
		})
	}
}
