package main

import (
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"github.com/tidbcloud/tiinf/tiinf"

	tigin "github.com/tidbcloud/tiinf/transport/http/tigin"
)

func checkParamValid() error {
	// if XXX {
	//	return tierror.
	// }
	return nil
}

// url: /orgs/:org_id/get_user_info
func GetUserProfileHandler(c *gin.Context) {
	// 1. Parse Params
	if err := checkParamValid(); err != nil {
		tilog.Error(c, fmt.Sprintf("ERROR: CheckParamValid failed! err:%v", err))
		tigin.AbortWithError(c, err)
		return
	}
	authInfo, _ := tigin.GetCurrentAuthInfo(c)
	fmt.Println("auth info is %+v", authInfo)
	// TODO(bing.wang) biz logic
	// Process(xxxx)

	resp := gin.H{"msg": "hello world"}
	c.JSON(http.StatusOK, resp)
	return
}

func genAccountRPCClient(f tiinf.TiInf) account.AccountAPIServiceClient {
	// NOTE(bing.wang): AccountProviderConn is initialized by tiinf automatically,
	// You can also use below method to create this connection
	// conn, err :+`tigrpc_client.NewClientConn(ACCOUNT_PROVIDER_SVC_ADDR, tigrpc_client.WithDefault())
	return account.NewAccountAPIServiceClient(f.RPCConns().AccountProviderConn)
}

func RegisterHttpHandler(f tiinf.TiInf) {
	// Auth
	accountClient := genAccountRPCClient(f)
	f.GinEngine().Use(tigin.CheckAuthByAuth0AndAPIKey(accountClient))

	// RBAC Permission
	// Related Doc_1: https://pingcap.feishu.cn/wiki/wikcnbnqHYlQxeZeJ2GSDXAXjch
	// Related Doc_2: https://pingcap.feishu.cn/wiki/wikcnq9axFCGch9RSxKOi8F6EVd
	// uri configmap
	var pathPattern2ResourceMap = map[string]string{
		"get:/orgs/(\\d+)/get_user_info": "orgs/{org_id}/my_user_profile/get",
	}
	// uri white list
	var pathWhitelist = []string{"/health_check"}
	f.GinEngine().Use(tigin.CheckRBACPermission(accountClient, pathPattern2ResourceMap, pathWhitelist))

	// Register biz logic handlers
	f.GinEngine().GET("/orgs/:org_id/get_user_info", GetUserProfileHandler)
}

func main() {
	// create a new inf
	inf := tiinf.NewInf()
	// initialize with config file
	err := inf.Init(
		tiinf.WithConfigFile("./demo.yaml"),
	)

	if err != nil {
		panic("Init tiinf failed. " + err.Error())
	}

	// regist user-define handlers and middlewares
	RegisterHttpHandler(inf)

	err = inf.Run()
	if err != nil {
		panic(err)
	}
}
