package inventory

import (
	"context"
	"errors"
	"testing"

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

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

var errStockWrite = errors.New("stock write failed")

// UpdateStock and UpdateOpnameStatusOn dropped the sqlc :execrows row count, so
// a zero-row UPDATE reported success while writing nothing: a stock movement
// that changed no quantity, or a stock take left 'draft' after its adjustments
// committed. Both are now hard errors — every caller passes a primary key taken
// from a row locked FOR UPDATE in the same transaction, so a zero is an
// integrity failure, never a legitimate no-op. Same ErrNotFound mapping the rest
// of the codebase uses (internal/purchasing, internal/distribution).
func TestRepositoryExecRowsMapsZeroRows(t *testing.T) {
	r := &Repository{}
	ctx := context.Background()
	cases := []struct {
		name string
		tag  pgconn.CommandTag
		err  error
		want error // errors.Is target; nil means a silent pass
	}{
		{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: errStockWrite, want: errStockWrite},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			q := &fakeTx{tag: tc.tag, err: tc.err}

			stockErr := r.UpdateStock(ctx, q, db.UpdateStockRowParams{
				ID: 7, Quantity: decimal.NewFromInt(5), ReservedQuantity: decimal.Zero,
			})
			opnameErr := r.UpdateOpnameStatusOn(ctx, q, 7, "completed")

			if tc.want == nil {
				if stockErr != nil {
					t.Errorf("UpdateStock error = %v, want nil", stockErr)
				}
				if opnameErr != nil {
					t.Errorf("UpdateOpnameStatusOn error = %v, want nil", opnameErr)
				}
				return
			}
			if !errors.Is(stockErr, tc.want) {
				t.Errorf("UpdateStock error = %v, want %v", stockErr, tc.want)
			}
			if !errors.Is(opnameErr, tc.want) {
				t.Errorf("UpdateOpnameStatusOn error = %v, want %v", opnameErr, tc.want)
			}
		})
	}
}
