// Package gcssamplesloader implements samplesloader.SamplesLoader for Google Cloud Storage.
package gcssamplesloader

import (
	"bytes"
	"context"
	"fmt"
	"io"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/gcs/mocks"
	"go.skia.org/infra/go/paramtools"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/perf/go/config"
	"go.skia.org/infra/perf/go/ingest/parser"
)

// sourceFileBody is a source file that contains the following keys:
//
//	,config=8888,name=mytest,sub_result=min_ms,
//	,config=565,name=mytest,sub_result=min_ms,
const sourceFileBody = `{
    "gitHash": "fe4a4029a080bc955e9588d05a6cd9eb490845d4",
    "issue": "327697",
    "patchset": "1",
    "results": {
      "mytest": {
        "8888": {
          "min_ms": 2.223606,
          "samples": [
            0.2057559490203857,
            0.1993551254272461,
            0.198721170425415
            ]
        },
        "565": {
          "min_ms": 2.215988,
          "samples": [
            0.199286937713623,
            0.1990699768066406,
            0.1992120742797852
          ]
        }
      }
    }
  }
`

// Returns ingestion parser.
func ingestParser(t *testing.T) *parser.Parser {
	instanceConfig := &config.InstanceConfig{
		IngestionConfig: config.IngestionConfig{
			Branches: nil,
		},
	}
	p, err := parser.New(context.Background(), instanceConfig)
	require.NoError(t, err)
	return p
}

func TestLoad_Success(t *testing.T) {
	ctx := context.Background()

	const sourceFilePath = "path/file.json"
	const sourceFileName = "gs://skia-perf/" + sourceFilePath

	gcsclient := &mocks.GCSClient{}
	r := bytes.NewBufferString(sourceFileBody)
	gcsclient.On("FileReader", testutils.AnyContext, sourceFilePath).Return(io.NopCloser(r), nil)

	g := New(gcsclient, ingestParser(t))
	sampleSet, err := g.Load(ctx, sourceFileName)
	require.NoError(t, err)
	expected := parser.SamplesSet{
		",config=565,sub_result=min_ms,test=mytest,": parser.Samples{
			Params: paramtools.Params{"config": "565", "sub_result": "min_ms", "test": "mytest"},
			Values: []float64{0.199286937713623, 0.1990699768066406, 0.1992120742797852},
		},
		",config=8888,sub_result=min_ms,test=mytest,": parser.Samples{
			Params: paramtools.Params{"config": "8888", "sub_result": "min_ms", "test": "mytest"},
			Values: []float64{0.2057559490203857, 0.1993551254272461, 0.198721170425415},
		},
	}
	require.Equal(t, expected, sampleSet)
}

func TestLoad_FileReaderFails_Failure(t *testing.T) {
	ctx := context.Background()
	const sourceFilePath = "path/file.json"
	const sourceFileName = "gs://skia-perf/" + sourceFilePath
	gcsclient := &mocks.GCSClient{}
	gcsclient.On("FileReader", testutils.AnyContext, sourceFilePath).Return(nil, fmt.Errorf("something broke"))

	g := New(gcsclient, ingestParser(t))
	_, err := g.Load(ctx, sourceFileName)
	require.Contains(t, err.Error(), "Failed to load from storage")
}

func TestLoad_InvalidFilenameURL_Failure(t *testing.T) {
	ctx := context.Background()
	gcsclient := &mocks.GCSClient{}
	g := New(gcsclient, ingestParser(t))
	_, err := g.Load(ctx, "::: not a valid url :::")
	require.Contains(t, err.Error(), "Failed to parse filename")
}

func TestLoad_InvalidJSON_Failure(t *testing.T) {
	ctx := context.Background()

	const sourceFilePath = "path/file.json"
	const sourceFileName = "gs://skia-perf/" + sourceFilePath

	gcsclient := &mocks.GCSClient{}
	r := bytes.NewBufferString("}this isn't valid JSON{")
	gcsclient.On("FileReader", testutils.AnyContext, sourceFilePath).Return(io.NopCloser(r), nil)

	g := New(gcsclient, ingestParser(t))
	_, err := g.Load(ctx, sourceFileName)
	require.Contains(t, err.Error(), "Failed to parse samples from file")
}
