package api

import (
	"fmt"
	"net/http"
	"net/http/httputil"
	"net/url"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/errcode"
	"github.com/pingcap/errors"
	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/account/thirdparty/billing2"
)

func BillingProxy(c *gin.Context) {
	proxyPath := c.Params.ByName("any")
	userContext := GetUserContext(c)
	tenantUser, err := userContext.GetAccountUser(c)
	if err != nil {
		Fail(c, fmt.Errorf("get User failed"), http.StatusInternalServerError)
		return
	}
	target, err := url.Parse(config.Global().BillingConfig.Billing2BaseURL)
	if err != nil {
		err := errcode.NewInternalErr(errors.New("proxy error: billing address error"))
		Fail(c, err, http.StatusInternalServerError)
		return
	}

	director := func(req *http.Request) {
		req.URL.Scheme = target.Scheme
		req.URL.Host = target.Host
		req.URL.Path = proxyPath
		req.Header.Set(billing2.AccountIDHeader, strconv.FormatUint(tenantUser.ID.Uint64(), 10))
		req.Header.Set(billing2.RequestSource, billing2.RequestSourceOps)
	}
	proxy := &httputil.ReverseProxy{Director: director}
	proxy.ServeHTTP(c.Writer, c.Request)
}
