package influxdb

import (
	"context"
	"time"

	"github.com/influxdata/influxdb/v2/kit/platform"
)

// OperationLogEntry is a record in an operation log.
type OperationLogEntry struct {
	Description string      `json:"description"`
	UserID      platform.ID `json:"userID,omitempty"`
	Time        time.Time   `json:"time,omitempty"`
}

// DashboardOperationLogService is an interface for retrieving the operation log for a dashboard.
type DashboardOperationLogService interface {
	// GetDashboardOperationLog retrieves the operation log for the dashboard with the provided id.
	GetDashboardOperationLog(ctx context.Context, id platform.ID, opts FindOptions) ([]*OperationLogEntry, int, error)
}

// BucketOperationLogService is an interface for retrieving the operation log for a bucket.
type BucketOperationLogService interface {
	// GetBucketOperationLog retrieves the operation log for the bucket with the provided id.
	GetBucketOperationLog(ctx context.Context, id platform.ID, opts FindOptions) ([]*OperationLogEntry, int, error)
}

// UserOperationLogService is an interface for retrieving the operation log for a user.
type UserOperationLogService interface {
	// GetUserOperationLog retrieves the operation log for the user with the provided id.
	GetUserOperationLog(ctx context.Context, id platform.ID, opts FindOptions) ([]*OperationLogEntry, int, error)
}

// OrganizationOperationLogService is an interface for retrieving the operation log for an org.
type OrganizationOperationLogService interface {
	// GetOrganizationOperationLog retrieves the operation log for the org with the provided id.
	GetOrganizationOperationLog(ctx context.Context, id platform.ID, opts FindOptions) ([]*OperationLogEntry, int, error)
}

// DefaultOperationLogFindOptions are the default options for the operation log.
var DefaultOperationLogFindOptions = FindOptions{
	Descending: true,
	Limit:      100,
}