package api

import (
	"net/http"
	"strings"

	"github.com/tidbcloud/tiinf/monitor/tilog"

	"github.com/tidbcloud/account/internel/dao/entity"
	rbacsvc "github.com/tidbcloud/account/internel/svc/rbac"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/account/admin/forms"
)

func CreateRbacRoleBinding(c *gin.Context) {
	ctx := c.Request.Context()
	req := forms.RbacRoleBinding{}
	if err := c.ShouldBindJSON(&req); err != nil {
		Fail(c, err, http.StatusBadRequest)
		return
	}

	rbacRoleBindingSvc, err := rbacsvc.GetRbacRoleBindingSvc()
	if err != nil {
		Fail(c, err, http.StatusInternalServerError)
		return
	}
	scopeType := entity.ParseScopeType(strings.ToUpper(req.ScopeType))
	if scopeType == entity.RoleBindingScopeInvalid {
		Fail(c, err, http.StatusBadRequest)
		return
	}
	err = rbacRoleBindingSvc.CreateRoleBinding(ctx, req.TargetType, req.TargetID, scopeType, req.ScopeID, req.RoleID)
	if err != nil {
		tilog.Error(ctx, "create rbacRoleBinding fail:"+err.Error())

		Fail(c, err, http.StatusInternalServerError)
		return
	}
	Success(c, nil, http.StatusOK)
}

func DeleteRbacRoleBinding(c *gin.Context) {
	ctx := c.Request.Context()
	req := forms.RbacRoleBinding{}
	if err := c.ShouldBindJSON(&req); err != nil {
		Fail(c, err, http.StatusBadRequest)
		return
	}
	rbacRoleBindingSvc, err := rbacsvc.GetRbacRoleBindingSvc()
	if err != nil {
		Fail(c, err, http.StatusInternalServerError)
		return
	}
	scopeType := entity.ParseScopeType(strings.ToUpper(req.ScopeType))
	if scopeType == entity.RoleBindingScopeInvalid {
		Fail(c, err, http.StatusBadRequest)
		return
	}
	err = rbacRoleBindingSvc.DeleteRoleBinding(ctx, req.TargetType, req.TargetID, scopeType, req.ScopeID, req.RoleID)
	if err != nil {

		tilog.Error(ctx, "delete rbacRoleBinding fail:"+err.Error())
		Fail(c, err, http.StatusInternalServerError)
		return
	}

	Success(c, nil, http.StatusOK)
}
