package api

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
	"github.com/pingcap/dbaas/billing2/version"
	ginprometheus "github.com/zsais/go-gin-prometheus"
)

// API processes all API call
type API struct {
}

type VersionResp struct {
	Hash string `json:"hash"`
}

// NewService create the gin engine and setup router
// @title Billing System  API
// @version 1.0
// @description This is a billing system server
// @host 127.0.0.1:18888
// @BasePath /api/v1/billing
func NewService() (*gin.Engine, error) {
	r := gin.Default()

	r.Use(ginutils.ErrorMiddleWare)
	p := ginprometheus.NewPrometheus("gin")
	p.ReqCntURLLabelMappingFn = func(c *gin.Context) string {
		return c.FullPath()
	}
	p.Use(r)

	r.GET("/version", func(c *gin.Context) { c.JSON(http.StatusOK, &VersionResp{Hash: version.GitHash}) })
	ws := ginutils.MyRoute{Route: r.Group("/api/v1/billing")}

	//measures /customers/:customer/units
	InitializeMeasureRouter(ws)

	//units /units
	InitializeUnitRouter(ws)

	//packages /packages /tenants/:tenant_id/binded_packages
	InitializePackageRouter(ws)

	//payments /tenants/:tenant_id/payments
	InitializePaymentRouter(ws)

	//invoices /tenants/:tenant_id/invoices
	InitializeInvoiceRouter(ws)

	//costexplorer /tenants/:tenant_id/costexplorer
	InitializeCostExplorerRouter(ws)

	//migrate /migrates
	InitializeMigrateRouter(ws)

	//subscription /tenants/:tenant_id/subscription
	InitializeSubscriptionRouter(ws)
	return r, nil

}

func NewWorkerService() (*gin.Engine, error) {
	r := gin.Default()
	r.GET("/version", func(c *gin.Context) { c.JSON(http.StatusOK, &VersionResp{Hash: version.GitHash}) })
	return r, nil
}
