package tracecache

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"

	"go.skia.org/infra/go/cache"
	"go.skia.org/infra/go/paramtools"
	"go.skia.org/infra/go/query"
	"go.skia.org/infra/perf/go/types"
)

// TraceCache provides a struct to cache trace information.
type TraceCache struct {
	cacheClient cache.Cache
}

// New returns a new TraceCache that can write and read from
// the provided cache instance.
func New(cache cache.Cache) *TraceCache {
	return &TraceCache{
		cacheClient: cache,
	}
}

// CacheTraceIds adds the provided traceIds to the cache.
func (t *TraceCache) CacheTraceIds(ctx context.Context, tileNumber types.TileNumber, q *query.Query, traceIds []paramtools.Params) error {
	cacheKey := traceIdCacheKey(tileNumber, *q)
	cacheValue, err := toJSON(traceIds)
	if err != nil {
		return err
	}

	return t.cacheClient.SetValue(ctx, cacheKey, cacheValue)
}

// GetTraceIds returns the traceIds for the given tile number and query from the cache.
func (t *TraceCache) GetTraceIds(ctx context.Context, tileNumber types.TileNumber, q *query.Query) ([]paramtools.Params, error) {
	cacheKey := traceIdCacheKey(tileNumber, *q)
	cacheJson, err := t.cacheClient.GetValue(ctx, cacheKey)
	if err != nil {
		return nil, err
	}

	if cacheJson == "" {
		return nil, nil
	}

	var traceIds []paramtools.Params
	err = json.Unmarshal([]byte(cacheJson), &traceIds)
	if err != nil {
		return nil, err
	}

	return traceIds, nil
}

// traceIdCacheKey returns a string key to use in the cache.
func traceIdCacheKey(tileNumber types.TileNumber, q query.Query) string {
	return fmt.Sprintf("%d_%s", tileNumber, q.KeyValueString())
}

// toJSON creates a json string from an object.
func toJSON(obj interface{}) (string, error) {
	var buffer bytes.Buffer
	err := json.NewEncoder(&buffer).Encode(obj)
	if err != nil {
		return "", err
	}

	return buffer.String(), nil
}
