package comsvc

import (
	"context"

	"github.com/tidbcloud/account/internel/dto"

	"github.com/tidbcloud/account/internel/dao/comdao"

	"github.com/tidbcloud/account/central/utils"
	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

func ListEntitiesByPage(ctx context.Context, pageParams dto.PageParams, model interface{}) (*utils.Paginator, error) {
	tilog.Info(ctx, "ListEntitiesByPage", zap.Any("queryParams", pageParams))
	return comdao.ListEntitiesByPage(ctx, database.DBConn.DB.WithContext(ctx), pageParams, model)
}

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

// GetEntity retrieves an entity based on the provided filter criteria.
func GetEntity(ctx context.Context, comFilter dto.ComFilter, model interface{}) (interface{}, error) {
	tilog.Info(ctx, "GetEntity", zap.Any("ComFilter", comFilter))
	return comdao.GetEntity(ctx, database.DBConn.DB.WithContext(ctx), comFilter, model)
}

// UpdateEntity updates an entity in the database based on specified filters and update values.
func UpdateEntity(ctx context.Context, comFilter dto.ComFilter, updates map[string]interface{}, model interface{}) error {
	tilog.Info(ctx, "UpdateEntity", zap.Any("updates", updates))
	return comdao.UpdateEntity(ctx, database.DBConn.DB.WithContext(ctx), comFilter, updates, model)
}

// DeleteEntity deletes an entity based on the provided conditions.
func DeleteEntity(ctx context.Context, comFilter dto.ComFilter, model interface{}) error {
	tilog.Info(ctx, "DeleteEntity", zap.Any("comFilter", comFilter))
	return comdao.DeleteEntity(ctx, database.DBConn.DB.WithContext(ctx), comFilter, model)
}
