package channeladmin

import (
	"context"
	"strconv"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/AgentTeam/internal/coredb"
)

type receiptResult int64

func (result receiptResult) RowsAffected() int64 { return int64(result) }

type receiptExecStub struct {
	rowsAffected int64
}

func (stub receiptExecStub) Exec(context.Context, string, ...any) (coredb.Result, error) {
	return receiptResult(stub.rowsAffected), nil
}

func (receiptExecStub) Query(context.Context, string, ...any) (coredb.Rows, error) {
	panic("unexpected Query")
}

func (receiptExecStub) QueryRow(context.Context, string, ...any) coredb.Row {
	panic("unexpected QueryRow")
}

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

	for _, tc := range []struct {
		name         string
		rowsAffected int64
		wantErr      bool
	}{
		{name: "reserved row finalized", rowsAffected: 1},
		{name: "missing reservation fails closed", rowsAffected: 0, wantErr: true},
		{name: "multiple reservations fail closed", rowsAffected: 2, wantErr: true},
	} {
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			err := SetReceiptResult(
				context.Background(),
				receiptExecStub{rowsAffected: tc.rowsAffected},
				"wsp_1",
				"agt_1",
				"req_1",
				`{"ok":true}`,
			)
			if tc.wantErr {
				require.EqualError(t, err, "set channel operation receipt result: expected 1 reserved row, updated "+strconv.FormatInt(tc.rowsAffected, 10))
				return
			}
			require.NoError(t, err)
		})
	}
}
