package rbac

import (
	"context"
	"sync"

	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/commons/ddb"
	"github.com/tidbcloud/account/internel/dao"
	ddbDao "github.com/tidbcloud/account/internel/dao/ddb"
	r "github.com/tidbcloud/account/internel/dao/rbac"
	"gorm.io/gorm"

	"github.com/tidbcloud/account/internel/dao/entity"
)

type RbacPrivilegeIface interface {
	CreateRbacPrivilege(ctx context.Context, resourceUri string, url string, system string, description string) (*entity.RbacPrivilege, error)
	ListRbacPrivileges(context.Context, r.ListPrivilegeParam) (*r.ListPrivilegeResult, error)
	GetRbacPrivilegeByID(ctx context.Context, id uint64) (*entity.RbacPrivilege, error)
	UpdateRbacPrivilege(ctx context.Context, id uint64, resourceUri string, url string, system string, description string) error
	DeleteRbacPrivilege(ctx context.Context, id uint64) error
}

var (
	rbacPrivilegeInitOnce sync.Once
	rbacPrivilegeSrv      RbacPrivilegeIface
	rbacPrivilegeInitErr  error
)

func GetRbacPrivilegeSvc() (RbacPrivilegeIface, error) {
	rbacPrivilegeInitOnce.Do(func() {
		dynanoDB, err := ddb.NewDynamoDB(config.Global())
		if err != nil {
			rbacPrivilegeInitErr = err
			return
		}
		rbacPrivilegeSrv = NewRbacPrivilegesSvc(database.DBConn.DB, dynanoDB, dao.GetDaoHub())

	})
	return rbacPrivilegeSrv, rbacPrivilegeInitErr
}

type RbacPrivilegeSvc struct {
	db       *gorm.DB
	dynamodb *ddbDao.DynamoDBClient
	hub      *dao.DaoHub
}

func NewRbacPrivilegesSvc(db *gorm.DB, dynamodb *ddbDao.DynamoDBClient, hub *dao.DaoHub) RbacPrivilegeIface {
	return &RbacPrivilegeSvc{
		db:       db,
		dynamodb: dynamodb,
		hub:      hub,
	}
}

func (r *RbacPrivilegeSvc) CreateRbacPrivilege(ctx context.Context, resourceUri string, url string, system string, description string) (*entity.RbacPrivilege, error) {

	return r.hub.Rbac.CreateRbacPrivilege(ctx, r.db, resourceUri, url, system, description)
}
func (r *RbacPrivilegeSvc) GetRbacPrivilegeByID(ctx context.Context, id uint64) (*entity.RbacPrivilege, error) {

	return r.hub.Rbac.GetRbacPrivilegeByID(ctx, r.db, id)
}
func (r *RbacPrivilegeSvc) ListRbacPrivileges(ctx context.Context, param r.ListPrivilegeParam) (*r.ListPrivilegeResult, error) {

	return r.hub.Rbac.ListRbacPrivileges(ctx, r.db, param)
}
func (r *RbacPrivilegeSvc) UpdateRbacPrivilege(ctx context.Context, id uint64, resourceUri string, url string, system string, description string) error {

	return r.hub.Rbac.UpdateRbacPrivilege(ctx, r.db, r.dynamodb, id, resourceUri, url, system, description)
}
func (r *RbacPrivilegeSvc) DeleteRbacPrivilege(ctx context.Context, id uint64) error {

	return r.hub.Rbac.DeleteRbacPrivilege(ctx, r.db, r.dynamodb, id)
}
