package util

import (
	"context"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/stretchr/testify/require"
	cipd_git "go.skia.org/infra/bazel/external/cipd/git"
	"go.skia.org/infra/go/git"
	git_testutils "go.skia.org/infra/go/git/testutils"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/go/util"
)

const (
	TEST_GROUP_NAME = "test group name"
	TEST_UNIQUE_ID  = "test unique ID"
	TEST_HASH       = "abcde"
)

func TestCommitToSyntheticRepo(t *testing.T) {
	ctx := cipd_git.UseGitFinder(context.Background())

	// Create a test repo.
	gb := git_testutils.GitInitWithDefaultBranch(t, ctx, git.MainBranch)
	defer gb.Cleanup()

	// Populate it with an initial whitespace file. Below CreateBranchTrackBranch
	// and CheckoutBranch steps do not seem to work without it.
	gb.Add(ctx, "whitespace.txt", " ")
	gb.CommitMsg(ctx, "Initial whitespace commit")
	// Create a branch and check it out, otherwise we can't push
	// to git.DefaultRemoteBranch on this repo.
	gb.CreateBranchTrackBranch(ctx, "somebranch", git.DefaultRemote+"/"+git.MainBranch)
	gb.CheckoutBranch(ctx, "somebranch")

	// Create tmp dir that gets cleaned up.
	workdir, err := os.MkdirTemp("", "ct_perf_test_commit")
	require.NoError(t, err)
	defer util.RemoveAll(workdir)

	// Create git.Checkout.
	checkout, err := git.NewCheckout(context.Background(), gb.Dir(), workdir)
	require.NoError(t, err)
	err = checkout.CleanupBranch(ctx, git.MainBranch)
	require.NoError(t, err)

	// Make sure email and name are correctly set.
	_, err = checkout.Git(ctx, "config", "user.email", "tester@example.com")
	require.NoError(t, err)
	_, err = checkout.Git(ctx, "config", "user.name", "tester@example.com")
	require.NoError(t, err)

	// Commit to the synthetic repo
	gitExec, err := git.Executable(ctx)
	require.NoError(t, err)
	hash, err := commitToSyntheticRepo(ctx, TEST_GROUP_NAME, TEST_UNIQUE_ID, gitExec, checkout)
	require.NoError(t, err)

	// Confirm that the expected commit is there.
	log, err := checkout.Git(ctx, "log", "--pretty=oneline")
	require.NoError(t, err)
	loglines := strings.Split(log, "\n")
	require.Contains(t, loglines[0], hash)
	require.Contains(t, loglines[0], fmt.Sprintf("Commit for %s by %s", TEST_GROUP_NAME, TEST_UNIQUE_ID))
}

func TestConvertCSVToBenchData(t *testing.T) {
	testDataDir := testutils.TestDataDir(t)
	pathToTestCSV := filepath.Join(testDataDir, "test.csv")

	perfData, err := convertCSVToBenchData(TEST_HASH, TEST_GROUP_NAME, TEST_UNIQUE_ID, pathToTestCSV)
	require.NoError(t, err)
	require.NotNil(t, perfData)
	require.Equal(t, perfData.Hash, TEST_HASH)
	require.Equal(t, perfData.RunID, TEST_UNIQUE_ID)
	require.Equal(t, perfData.Key["group_name"], TEST_GROUP_NAME)
	require.Len(t, perfData.Results, 2)
	require.Equal(t, perfData.Results["http://www.reuters.com"]["default"]["paint_op_count"], 805.0)
	require.Equal(t, perfData.Results["http://www.reuters.com"]["default"]["rasterize_time (ms)"], 2.449)
	require.Equal(t, perfData.Results["http://www.reuters.com"]["default"]["options"], map[string]int{"page_rank": 480})
	require.Equal(t, perfData.Results["http://www.rediff.com"]["default"]["paint_op_count"], 643.0)
	require.Equal(t, perfData.Results["http://www.rediff.com"]["default"]["rasterize_time (ms)"], 2.894)
	require.Equal(t, perfData.Results["http://www.rediff.com"]["default"]["options"], map[string]int{"page_rank": 490})
}
