package finance

import (
	"context"
	"errors"
	"testing"

	"github.com/jackc/pgx/v5/pgconn"

	"github.com/TaruLab/keluargamart-backend/internal/db"
)

var errSOStatusWrite = errors.New("so status write failed")

// SetSOStatus targets one locked order row: zero rows is an integrity
// failure, never a silent pass.
func TestRepositorySetSOStatusRowCount(t *testing.T) {
	r := &Repository{}
	ctx := context.Background()
	cases := []struct {
		name string
		tag  pgconn.CommandTag
		err  error
		want error
	}{
		{name: "zero rows is not success", tag: pgconn.NewCommandTag("UPDATE 0"), want: ErrNotFound},
		{name: "one row passes", tag: pgconn.NewCommandTag("UPDATE 1"), want: nil},
		{name: "driver error surfaces unchanged", tag: pgconn.NewCommandTag("UPDATE 0"), err: errSOStatusWrite, want: errSOStatusWrite},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			err := r.SetSOStatus(ctx, &fakeTx{tag: tc.tag, err: tc.err}, db.SetSOStatusParams{ID: 7, Status: "invoiced"})
			if tc.want == nil {
				if err != nil {
					t.Errorf("SetSOStatus error = %v, want nil", err)
				}
				return
			}
			if !errors.Is(err, tc.want) {
				t.Errorf("SetSOStatus error = %v, want %v", err, tc.want)
			}
		})
	}
}
