package repository

import (
	"context"

	"git.kirlllll.ru/volontery/backend/internal/database"
)

// RBACRepository предоставляет методы для работы с RBAC
type RBACRepository struct {
	queries *database.Queries
}

// NewRBACRepository создает новый RBACRepository
func NewRBACRepository(queries *database.Queries) *RBACRepository {
	return &RBACRepository{queries: queries}
}

// GetUserRoles получает роли пользователя
func (r *RBACRepository) GetUserRoles(ctx context.Context, userID int64) ([]database.Role, error) {
	return r.queries.GetUserRoles(ctx, userID)
}

// AssignRoleToUser назначает роль пользователю
func (r *RBACRepository) AssignRoleToUser(ctx context.Context, params database.AssignRoleToUserParams) (*database.UserRole, error) {
	result, err := r.queries.AssignRoleToUser(ctx, params)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// GetRoleByName получает роль по имени
func (r *RBACRepository) GetRoleByName(ctx context.Context, name string) (*database.Role, error) {
	result, err := r.queries.GetRoleByName(ctx, name)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// UserHasRole проверяет наличие роли у пользователя
func (r *RBACRepository) UserHasRole(ctx context.Context, params database.UserHasRoleParams) (bool, error) {
	return r.queries.UserHasRole(ctx, params)
}

// UserHasRoleByName проверяет наличие роли по имени
func (r *RBACRepository) UserHasRoleByName(ctx context.Context, params database.UserHasRoleByNameParams) (bool, error) {
	return r.queries.UserHasRoleByName(ctx, params)
}

// GetUserPermissions получает все разрешения пользователя
func (r *RBACRepository) GetUserPermissions(ctx context.Context, userID int64) ([]database.GetUserPermissionsRow, error) {
	return r.queries.GetUserPermissions(ctx, userID)
}

// UserHasPermission проверяет наличие разрешения у пользователя
func (r *RBACRepository) UserHasPermission(ctx context.Context, params database.UserHasPermissionParams) (bool, error) {
	return r.queries.UserHasPermission(ctx, params)
}
