package tests

import (
	"encoding/json"
	"net/http"
	"testing"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/api"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/payment/paymentsub"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
	"github.com/pingcap/dbaas/billing2/utils/tests"
	"github.com/stretchr/testify/suite"
)

type PaymentTestSuite struct {
	tests.BillingTestSuite
	router *gin.Engine
}

var paymentModel = &paymentsub.PaymentModel{}

func (suite *PaymentTestSuite) SetupTest() {
	suite.BillingTestSuite.SetupTest()
	suite.router = gin.New()
	suite.router.Use(ginutils.ErrorMiddleWare)
	api.InitializePaymentRouter(ginutils.MyRoute{Route: suite.router})
}

func TestPaymentSuite(t *testing.T) {
	suite.Run(t, new(PaymentTestSuite))
}

func (suite *PaymentTestSuite) TestCreatePayment() {
	assert := suite.Assert()

	tests.MockCentralHandler()
	tests.MockPaymentHandler()
	w := tests.PerformRequest(suite.router, "POST", "/tenants/1/payments", &forms.PaymentMethod{
		PaymentType: "mock",
	})
	assert.Equal(http.StatusOK, w.Code)
	info, err := paymentModel.GetPaymentMethod(uint(1))
	assert.NoError(err)
	assert.Equal(info.PaymentType, "mock")
}

func (suite *PaymentTestSuite) TestListPayments() {
	assert := suite.Assert()

	tests.MockCentralHandler()
	tests.MockPaymentHandler()
	_, err := paymentModel.CreatePaymentMethod(uint(1), &forms.PaymentMethod{
		PaymentType: "mock",
	})
	assert.NoError(err)
	w := tests.PerformGetRequest(suite.router, "/tenants/1/payments")
	assert.Equal(http.StatusOK, w.Code)
	ret := []forms.PaymentMethod{}
	err = json.NewDecoder(w.Body).Decode(&ret)
	assert.NoError(err)
	assert.Len(ret, 1)
	assert.Equal(ret[0].PaymentType, "mock")
}
