package rbac

import (
	"context"

	ddbDao "github.com/tidbcloud/account/internel/dao/ddb"
	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
)

type RbacDaoIface interface {
	//Dao() *RbacDao

	// Role
	CreateRbacRole(ctx context.Context, tx *gorm.DB, name string, description string, scopeType entity.ScopeType, displayName string) error
	ListRbacRoles(ctx context.Context, tx *gorm.DB) ([]entity.RbacRole, error)
	GetRbacRoleByID(ctx context.Context, tx *gorm.DB, rbacRoleID uint64) (*entity.RbacRole, error)
	GetRbacRoleByName(ctx context.Context, tx *gorm.DB, name string) (*entity.RbacRole, error)
	GetRbacRoleByNameIn(ctx context.Context, tx *gorm.DB, names []string) ([]entity.RbacRole, error)
	UpdateRbacRole(ctx context.Context, tx *gorm.DB, rbacRoleID uint64, name string, description string, scopeType entity.ScopeType, displayName string) error
	DeleteRbacRole(ctx context.Context, tx *gorm.DB, rbacRoleID uint64) error
	ListRbacRolesByIDs(ctx context.Context, tx *gorm.DB, rbacRoleIDs []uint64) ([]entity.RbacRole, error)
	TraverseRbacRoles(ctx context.Context, tx *gorm.DB, param *ListRoleParam) (*ListRoleResult, error)

	// Privilege
	CreateRbacPrivilege(ctx context.Context, tx *gorm.DB, resourceUri string, url string, system string, description string) (*entity.RbacPrivilege, error)
	ListRbacPrivileges(ctx context.Context, tx *gorm.DB, param ListPrivilegeParam) (*ListPrivilegeResult, error)
	ListRbacPrivilegesByIDs(ctx context.Context, tx *gorm.DB, id []entity.ID) ([]entity.RbacPrivilege, error)
	GetRbacPrivilegeByID(ctx context.Context, tx *gorm.DB, id uint64) (*entity.RbacPrivilege, error)
	GetRbacPrivilegeByResourceUri(ctx context.Context, tx *gorm.DB, resourceUri string) (*entity.RbacPrivilege, error)
	UpdateRbacPrivilege(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, id uint64, resourceUri string, url string, system string, description string) error
	DeleteRbacPrivilege(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, id uint64) error

	// Role-Privilege
	CreateRbacRolePrivilege(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, roleID uint64, privilegeIDs []uint64) error
	ListRbacRolePrivileges(ctx context.Context, tx *gorm.DB, filter RolePrivilegeFilter) ([]entity.RbacRolePrivilege, error)
	ListRbacPrivilegesIDsByRoleID(ctx context.Context, tx *gorm.DB, roleIDs []uint64) ([]entity.ID, error)
	DeleteRbacRolePrivilege(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, roleID uint64, privilegeID uint64) error
	DeleteRbacRolePrivilegeByRoleID(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, roleID uint64) error
	DeleteRbacRolePrivilegeByPrivilegeID(ctx context.Context, tx *gorm.DB, ddb *ddbDao.DynamoDBClient, privilegeID uint64) error
}

type RbacDao struct{}

func NewRbacDao() RbacDaoIface {
	return &RbacDao{}
}
