package tests

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

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

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

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

func TestFXRateTestSuite(t *testing.T) {
	suite.Run(t, new(FXRateTestSuite))
}

func (suite *FXRateTestSuite) TestDocs() {
	assert := suite.Assert()
	var err error
	w := tests.PerformGetRequest(suite.router, "/fx_rates?base=usd&target=sgd")
	assert.Equal(http.StatusNotFound, w.Code, w.Body.String())
	req := &forms.InvoiceAppliedFXRate{
		Date:   time.Date(2024, 9, 30, 0, 0, 0, 0, time.UTC),
		Value:  decimal.RequireFromString("1.3555"),
		Base:   forms.CurrencyUSD,
		Target: forms.CurrencySGD,
	}
	w1 := tests.PerformRequest(suite.router, "POST", "/fx_rates", req)
	assert.Equal(http.StatusOK, w1.Code, w1.Body.String())

	w = tests.PerformGetRequest(suite.router, "/fx_rates?base=usd&target=sgd")
	assert.Equal(http.StatusOK, w.Code, w.Body.String())
	var resp forms.InvoiceAppliedFXRate
	err = json.Unmarshal(w.Body.Bytes(), &resp)
	assert.NoError(err)
	assert.Equal(req.Value, resp.Value)
	assert.Equal(req.Date, resp.Date)
}
