package benefactorkindboxreqvalidator

import (
	"context"
	"testing"
	"time"

	"git.gocasts.ir/ebhomengo/niki/entity"
	addressparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/address"
	kindboxreqparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/kind_box_req"
	refertimeparam "git.gocasts.ir/ebhomengo/niki/param/benefactor/refer_time"
	"github.com/stretchr/testify/assert"
)

func TestValidator_ValidateUpdateRequest(t *testing.T) {
	mockRepository := NewMockRepository(t)
	mockBenefactorSvc := NewMockBenefactorSvc(t)
	mockAddressSvc := NewMockAddressSvc(t)
	mockReferTimeSvc := NewMockReferTimeSvc(t)
	validator := New(mockBenefactorSvc, mockAddressSvc, mockReferTimeSvc, mockRepository)
	ctx := context.Background()

	t.Run("Successful validation", func(t *testing.T) {
		req := kindboxreqparam.KindBoxReqUpdateRequest{
			KindBoxReqID:       1,
			BenefactorID:       1,
			KindBoxType:        entity.KindBoxOnTable,
			CountRequested:     1,
			Description:        "test",
			DeliverReferTimeID: 1,
			DeliverReferDate:   time.Now().Add(time.Hour * 24),
			DeliverAddressID:   1,
		}

		mockRepository.EXPECT().KindBoxRequestExist(ctx, req.KindBoxReqID).Return(true, nil).Once()
		mockRepository.EXPECT().GetKindBoxReqByID(ctx, req.KindBoxReqID).Return(
			entity.KindBoxReq{BenefactorID: req.BenefactorID, Status: entity.KindBoxReqPendingStatus},
			nil,
		).Twice()
		mockAddressSvc.EXPECT().AddressExistByID(ctx, addressparam.GetAddressByIDRequest{ID: req.DeliverAddressID}).Return(
			addressparam.GetAddressByIDResponse{Address: entity.Address{BenefactorID: req.BenefactorID}},
			nil,
		).Once()
		mockReferTimeSvc.EXPECT().GetReferTimeByID(ctx, refertimeparam.GetReferTimeRequest{ReferTimeID: req.DeliverReferTimeID}).Return(
			refertimeparam.GetReferTimeResponse{ReferTime: entity.ReferTime{Status: entity.ReferTimeActiveStatus}},
			nil,
		).Once()

		fieldErrors, err := validator.ValidateUpdateRequest(ctx, req)

		assert.NoError(t, err)
		assert.Nil(t, fieldErrors)
	})
}