package oauth2

import (
	"context"
	"github.com/tidbcloud/auth-server/commons/database"
	"github.com/tidbcloud/auth-server/internal/dto"
	"github.com/tidbcloud/auth-server/internal/repository"

	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

func ListEntitiesByPage[T any](ctx context.Context, pageParams dto.PageParams) (*dto.Paginator, error) {
	tilog.Info(ctx, "ListEntitiesByPage", zap.Any("queryParams", pageParams))
	return repository.ListEntitiesByPage[T](ctx, database.DBConn.DB.WithContext(ctx), pageParams)
}

// ListEntities retrieves a list of entities based on the query parameters.
func ListEntities[T any](ctx context.Context, queryParams dto.ListParams) ([]T, error) {
	tilog.Info(ctx, "ListEntitiesByPage", zap.Any("queryParams", queryParams))
	return repository.ListEntities[T](ctx, database.DBConn.DB.WithContext(ctx), queryParams)
}

// GetEntity retrieves an entity based on the provided filter criteria.
func GetEntity[T any](ctx context.Context, comFilter dto.ComFilter) (*T, error) {
	tilog.Info(ctx, "GetEntity", zap.Any("ComFilter", comFilter))
	return repository.GetEntity[T](ctx, database.DBConn.DB.WithContext(ctx), comFilter)
}

// UpdateEntity updates an entity in the database based on specified filters and update values.

func UpdateEntity[T any](ctx context.Context, comFilter dto.ComFilter, updates map[string]interface{}) error {
	tilog.Info(ctx, "UpdateEntity", zap.Any("updates", updates))
	return repository.UpdateEntity[T](ctx, database.DBConn.DB.WithContext(ctx), comFilter, updates)
}

// DeleteEntity deletes an entity based on the provided conditions.

func DeleteEntity[T any](ctx context.Context, comFilter dto.ComFilter) error {
	tilog.Info(ctx, "DeleteEntity", zap.Any("comFilter", comFilter))
	return repository.DeleteEntity[T](ctx, database.DBConn.DB.WithContext(ctx), comFilter)
}
