package tests

import (
	"testing"

	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/payment/paymentsub"
	"github.com/pingcap/dbaas/billing2/utils/tests"
	"github.com/stretchr/testify/suite"
)

var paymentModel = &paymentsub.PaymentModel{}

type PaymentSuite struct {
	tests.BillingTestSuite
}

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

func (suite *PaymentSuite) TestGetPayment() {
	assert := suite.Assert()
	var tenantID uint = 1
	_, err := paymentModel.GetPaymentMethod(tenantID)
	assert.ErrorIs(err, billing_errors.ObjectNotExistsError)

	tests.MockPaymentHandler()
	tests.MockCentralHandler()
	paymentModel.CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: "mock",
		},
	)
	info, err := paymentModel.GetPaymentMethod(tenantID)
	assert.NoError(err)
	assert.NotNil(info)
	assert.Equal(info.PaymentType, "mock")
}

func (suite *PaymentSuite) TestCreatePayment() {
	tests.MockPaymentHandler()
	tests.MockCentralHandler()
	assert := suite.Assert()
	var tenantID uint = 1
	info, err := paymentModel.CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: "mock",
		},
	)
	assert.NoError(err)
	assert.Equal(info.PaymentType, "mock")
	assert.NotEmpty(info.PaymentCode)
}

func (suite *PaymentSuite) TestPayable() {
	tests.MockCentralHandler()
	tests.MockPaymentHandler()
	assert := suite.Assert()
	var tenantID uint = 1
	res, err := paymentModel.Payable(tenantID)
	assert.NoError(err)
	assert.False(res)

	_, err = paymentModel.CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: "mock",
		},
	)

	assert.NoError(err)

	res, err = paymentModel.Payable(tenantID)
	assert.NoError(err)
	assert.True(res)
}

func (suite *PaymentSuite) TestIsHourlyPayment() {
	tests.MockCentralHandler()
	tests.MockPaymentHandler()
	assert := suite.Assert()
	var tenantID uint = 1
	res, err := paymentModel.Payable(tenantID)
	assert.NoError(err)
	assert.False(res)

	_, err = paymentModel.CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: "mock",
		},
	)
	assert.NoError(err)

	isHourlyPayment, err := paymentModel.IsHourlyPayment(tenantID)
	assert.NoError(err)
	assert.False(isHourlyPayment)

	tenantID = 2

	_, err = paymentModel.CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: entity.PaymentType_AWS,
		},
	)
	assert.NoError(err)

	isHourlyPayment, err = paymentModel.IsHourlyPayment(tenantID)
	assert.NoError(err)
	assert.True(isHourlyPayment)

}
