package mongo

import (
	"context"

	"github.com/zeromicro/go-zero/core/stores/mon"
	"go.mongodb.org/mongo-driver/v2/mongo"
	"go.mongodb.org/mongo-driver/v2/mongo/options"
)

type DocumentDBUseCase interface {
	PopulateIndex(ctx context.Context, key string, sort int32, unique bool) error
	PopulateTTLIndex(ctx context.Context, key string, sort int32, unique bool, ttl int32) error
	PopulateMultiIndex(ctx context.Context, keys []string, sorts []int32, unique bool) error
	GetClient() *mon.Model
}

type DocumentDBWithCacheUseCase interface {
	DocumentDBUseCase
	CacheUseCase
	DeleteOne(ctx context.Context, key string, filter any, opts ...options.Lister[options.DeleteOneOptions]) (int64, error)
	FindOne(ctx context.Context, key string, v, filter any, opts ...options.Lister[options.FindOneOptions]) error
	FindOneAndDelete(ctx context.Context, key string, v, filter any, opts ...options.Lister[options.FindOneAndDeleteOptions]) error
	FindOneAndReplace(ctx context.Context, key string, v, filter, replacement any, opts ...options.Lister[options.FindOneAndReplaceOptions]) error
	InsertOne(ctx context.Context, key string, document any, opts ...options.Lister[options.InsertOneOptions]) (*mongo.InsertOneResult, error)
	UpdateByID(ctx context.Context, key string, id, update any, opts ...options.Lister[options.UpdateOneOptions]) (*mongo.UpdateResult, error)
	UpdateMany(ctx context.Context, keys []string, filter, update any, opts ...options.Lister[options.UpdateManyOptions]) (*mongo.UpdateResult, error)
	UpdateOne(ctx context.Context, key string, filter, update any, opts ...options.Lister[options.UpdateOneOptions]) (*mongo.UpdateResult, error)
}

type CacheUseCase interface {
	DelCache(ctx context.Context, keys ...string) error
	GetCache(ctx context.Context, key string, v any) error
	SetCache(ctx context.Context, key string, v any) error
}
