package config

import (
	"context"
	"encoding/json"
	"errors"
	"testing"

	"go.skia.org/infra/task_scheduler/go/specs"

	"github.com/stretchr/testify/require"

	allowed_mocks "go.skia.org/infra/go/allowed/mocks"
	"go.skia.org/infra/go/gerrit"
	gitiles_mocks "go.skia.org/infra/go/gitiles/mocks"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/go/testutils/unittest"
	cr_mocks "go.skia.org/infra/skcq/go/codereview/mocks"
)

func setupGetSkCQCfg(t *testing.T, match bool, cfgContents []byte, readFileError error, changedFiles []string, cfgPath string, updatedInChange bool) *GitilesConfigReader {
	matchedUser := "batman@gotham.com"
	unmatchedUser := "superman@krypton.com"

	changeOwner := unmatchedUser
	if match {
		changeOwner = matchedUser
	}

	ci := &gerrit.ChangeInfo{
		Issue:   int64(123),
		Owner:   &gerrit.Person{Email: changeOwner},
		Project: "test-repo",
		Branch:  "test-branch",
	}
	ref := "refs/changes/22/401222/140"

	// Setup codereview mock.
	cr := &cr_mocks.CodeReview{}
	if updatedInChange {
		cr.On("GetChangeRef", ci).Return(ref).Once()
	}

	// Mock gitilesRepo.
	gitilesRepo := &gitiles_mocks.GitilesRepo{}
	if updatedInChange {
		gitilesRepo.On("ReadFileAtRef", testutils.AnyContext, cfgPath, ref).Return(cfgContents, readFileError).Once()
	} else {
		gitilesRepo.On("ReadFileAtRef", testutils.AnyContext, cfgPath, ci.Branch).Return(cfgContents, readFileError).Once()
	}

	// Mock allow.
	allow := &allowed_mocks.Allow{}
	allow.On("Member", matchedUser).Return(true).Once()
	allow.On("Member", unmatchedUser).Return(false).Once()

	return &GitilesConfigReader{
		gitilesRepo:           gitilesRepo,
		cr:                    cr,
		ci:                    ci,
		changedFiles:          changedFiles,
		canModifyCfgsOnTheFly: allow,
	}
}

func TestGetSkCQCfg_UpdatedInChange(t *testing.T) {
	unittest.SmallTest(t)

	treeStatusURL := "http://tree-status-url"
	skCfg := &SkCQCfg{
		VisibilityType:   InternalVisibility,
		TreeStatusURL:    treeStatusURL,
		CommitterList:    "test-list",
		DryRunAccessList: "test-list",
	}
	skCfgContents, err := json.Marshal(skCfg)
	require.Nil(t, err)

	configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", SkCQCfgPath}, SkCQCfgPath, true)
	cfg, err := configReader.GetSkCQCfg(context.Background())
	require.Nil(t, err)
	require.Equal(t, treeStatusURL, cfg.TreeStatusURL)
	require.Equal(t, InternalVisibility, cfg.VisibilityType)
}

func TestGetSkCQCfg_UpdatedInChange_NotAllowed(t *testing.T) {
	unittest.SmallTest(t)

	configReader := setupGetSkCQCfg(t, false, []byte{}, nil, []string{"dir1/*", SkCQCfgPath}, SkCQCfgPath, true)
	cfg, err := configReader.GetSkCQCfg(context.Background())
	require.Nil(t, cfg)
	require.NotNil(t, err)
	_, ok := err.(*CannotModifyCfgsOnTheFlyError)
	require.True(t, ok)
}

func TestGetSkCQCfg_NotUpdatedInChange(t *testing.T) {
	unittest.SmallTest(t)

	treeStatusURL := "http://tree-status-url"
	skCfg := &SkCQCfg{
		VisibilityType:   PublicVisibility,
		TreeStatusURL:    treeStatusURL,
		CommitterList:    "test-list",
		DryRunAccessList: "test-list",
	}
	skCfgContents, err := json.Marshal(skCfg)
	require.Nil(t, err)

	configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
	cfg, err := configReader.GetSkCQCfg(context.Background())
	require.Nil(t, err)
	require.Equal(t, treeStatusURL, cfg.TreeStatusURL)
	require.Equal(t, PublicVisibility, cfg.VisibilityType)
}

func TestGetSkCQCfg_NotFound(t *testing.T) {
	unittest.SmallTest(t)

	configReader := setupGetSkCQCfg(t, true, []byte{}, errors.New("NOT_FOUND"), []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
	cfg, err := configReader.GetSkCQCfg(context.Background())
	require.Nil(t, cfg)
	require.NotNil(t, err)
	_, ok := err.(*ConfigNotFoundError)
	require.True(t, ok)
}

func TestGetSkCQCfg_ValidationFailed(t *testing.T) {
	unittest.SmallTest(t)

	treeStatusURL := "http://tree-status-url"
	// Missing CommitterList and DryRunAccessList.
	skCfg := &SkCQCfg{
		TreeStatusURL: treeStatusURL,
	}
	skCfgContents, err := json.Marshal(skCfg)
	require.Nil(t, err)

	configReader := setupGetSkCQCfg(t, true, skCfgContents, nil, []string{"dir1/*", "dir2/dir3/DEPS"}, SkCQCfgPath, false)
	cfg, err := configReader.GetSkCQCfg(context.Background())
	require.Nil(t, cfg)
	require.NotNil(t, err)
}

func TestGetTasksCfg_UpdatedInChange(t *testing.T) {
	unittest.SmallTest(t)

	tasksJSONPath := "test/path/tasks.json"
	tasksJSON := &specs.TasksCfg{}
	tasksJSONContents, err := json.Marshal(tasksJSON)
	require.Nil(t, err)

	configReader := setupGetSkCQCfg(t, true, tasksJSONContents, nil, []string{"dir1/*", tasksJSONPath}, tasksJSONPath, true)
	cfg, err := configReader.GetTasksCfg(context.Background(), tasksJSONPath)
	require.Nil(t, err)
	require.NotNil(t, cfg)
}

func TestGetTasksCfg_NotUpdatedInChange(t *testing.T) {
	unittest.SmallTest(t)

	tasksJSONPath := "test/path/tasks.json"
	tasksJSON := &specs.TasksCfg{}
	tasksJSONContents, err := json.Marshal(tasksJSON)
	require.Nil(t, err)

	configReader := setupGetSkCQCfg(t, true, tasksJSONContents, nil, []string{"dir1/*"}, tasksJSONPath, false)
	cfg, err := configReader.GetTasksCfg(context.Background(), tasksJSONPath)
	require.Nil(t, err)
	require.NotNil(t, cfg)
}
