package main

import (
	"encoding/json"
	"io/ioutil"
	"net/http"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/gold-client/go/mocks"
	"go.skia.org/infra/golden/go/types"
	"go.skia.org/infra/golden/go/web/frontend"
)

func TestDiff_LegacyTestParamUsed_Success(t *testing.T) {

	workDir := t.TempDir()
	setupAuthWithGSUtil(t, workDir)

	td := testutils.TestDataDir(t)

	mh := &mocks.HTTPClient{}
	j, err := json.Marshal(frontend.DigestListResponse{Digests: []types.Digest{a05Digest, a09Digest}})
	require.NoError(t, err)
	mh.On("Get", "https://my-instance-gold.skia.org/json/v2/digests?grouping=name%3Dpixel-tests%26source_type%3Dmy_corpus").Return(
		httpResponse(string(j), "200 OK", http.StatusOK), nil)

	a05Bytes, err := ioutil.ReadFile(filepath.Join(td, a05Digest+".png"))
	require.NoError(t, err)
	a09Bytes, err := ioutil.ReadFile(filepath.Join(td, a09Digest+".png"))
	require.NoError(t, err)
	mi := &mocks.ImageDownloader{}
	mi.On("DownloadImage", testutils.AnyContext, "https://my-instance-gold.skia.org", types.Digest(a05Digest)).Return(a05Bytes, nil)
	mi.On("DownloadImage", testutils.AnyContext, "https://my-instance-gold.skia.org", types.Digest(a09Digest)).Return(a09Bytes, nil)

	ctx, output, exit := testContext(nil, mh, mi, nil)
	env := diffEnv{
		deprecatedTest: "pixel-tests",
		corpus:         "my_corpus",
		instanceID:     "my-instance",
		inputFile:      filepath.Join(td, a01Digest+".png"),
		outDir:         filepath.Join(workDir, "output"),
		workDir:        workDir,
	}
	runUntilExit(t, func() {
		env.Diff(ctx)
	})
	logs := output.String()
	exit.AssertWasCalledWithCode(t, 0, logs)

	assert.Equal(t, `Going to compare f528252cd89506d50cf3b59147b8a6c1.png against 2 other images
Digest a05a05a05a05a05a05a05a05a05a05a0 was closest (combined metric of 0.207104)
`, logs)
}

func TestDiff_GroupingParamUsed_Success(t *testing.T) {

	workDir := t.TempDir()
	setupAuthWithGSUtil(t, workDir)

	td := testutils.TestDataDir(t)

	mh := &mocks.HTTPClient{}
	j, err := json.Marshal(frontend.DigestListResponse{Digests: []types.Digest{a05Digest, a09Digest}})
	require.NoError(t, err)
	mh.On("Get", "https://my-instance-gold.skia.org/json/v2/digests?grouping=color_config%3DRGBA8888%26name%3Dpixel-tests%26source_type%3Dmy_corpus").Return(
		httpResponse(string(j), "200 OK", http.StatusOK), nil)

	a05Bytes, err := ioutil.ReadFile(filepath.Join(td, a05Digest+".png"))
	require.NoError(t, err)
	a09Bytes, err := ioutil.ReadFile(filepath.Join(td, a09Digest+".png"))
	require.NoError(t, err)
	mi := &mocks.ImageDownloader{}
	mi.On("DownloadImage", testutils.AnyContext, "https://my-instance-gold.skia.org", types.Digest(a05Digest)).Return(a05Bytes, nil)
	mi.On("DownloadImage", testutils.AnyContext, "https://my-instance-gold.skia.org", types.Digest(a09Digest)).Return(a09Bytes, nil)

	ctx, output, exit := testContext(nil, mh, mi, nil)
	env := diffEnv{
		grouping:   "name=pixel-tests,color_config=RGBA8888",
		corpus:     "my_corpus",
		instanceID: "my-instance",
		inputFile:  filepath.Join(td, a01Digest+".png"),
		outDir:     filepath.Join(workDir, "output"),
		workDir:    workDir,
	}
	runUntilExit(t, func() {
		env.Diff(ctx)
	})
	logs := output.String()
	exit.AssertWasCalledWithCode(t, 0, logs)

	assert.Equal(t, `Going to compare f528252cd89506d50cf3b59147b8a6c1.png against 2 other images
Digest a05a05a05a05a05a05a05a05a05a05a0 was closest (combined metric of 0.207104)
`, logs)
}

func TestDiff_GroupingAndTestOmitted_ReturnsError(t *testing.T) {

	workDir := t.TempDir()
	setupAuthWithGSUtil(t, workDir)

	td := testutils.TestDataDir(t)

	ctx, output, exit := testContext(nil, nil, nil, nil)
	env := diffEnv{
		corpus:     "my_corpus",
		instanceID: "my-instance",
		inputFile:  filepath.Join(td, a01Digest+".png"),
		outDir:     filepath.Join(workDir, "output"),
		workDir:    workDir,
	}
	runUntilExit(t, func() {
		env.Diff(ctx)
	})
	logs := output.String()
	exit.AssertWasCalledWithCode(t, 1, logs)

	assert.Equal(t, `Must include either test or grouping`, logs)
}
