package schema

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestPhaseTransition(t *testing.T) {
	f := func(from, to Phase, wantErr bool) {
		t.Helper()
		err := from.Transition(to)
		if wantErr {
			assert.Error(t, err, "%s -> %s", from, to)
		} else {
			assert.NoError(t, err, "%s -> %s", from, to)
		}
	}
	f(PhasePending, PhaseRunning, false)
	f(PhasePending, PhaseFailed, false)
	f(PhasePending, PhaseImported, true)
	f(PhaseRunning, PhaseImported, false)
	f(PhaseRunning, PhaseFailed, false)
	f(PhaseRunning, PhasePending, true)
	f(PhaseImported, PhaseFailed, false)
	f(PhaseImported, PhaseRunning, true)
	f(PhaseFailed, PhaseRunning, false)
	f(PhaseFailed, PhaseImported, true)
	f(PhasePending, PhasePending, false) // no-op
}

func TestNewShardID(t *testing.T) {
	cases := []struct {
		name   string
		tenant TenantID
		idx    int
		want   ShardID
	}{
		{"valid", "1001:0", 1, "1001:0:1"},
		{"idxZero", "42", 0, "42:0"},
		{"emptyTenant", "", 5, ""},
		{"negativeIdx", "x", -1, ""},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			got := NewShardID(tc.tenant, tc.idx)
			assert.Equal(t, tc.want, got)
		})
	}
}
