package github

import (
	"context"
	"fmt"
	"net/http"
	"net/url"
	"testing"
	"time"

	"github.com/go-chi/chi/v5"
	"github.com/google/go-github/v29/github"
	"github.com/stretchr/testify/require"

	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/mockhttpclient"
	"go.skia.org/infra/go/testutils"
)

func TestAddComment(t *testing.T) {
	reqType := "application/json"
	reqBody := []byte(`{"body":"test msg"}
`)
	r := chi.NewRouter()
	md := mockhttpclient.MockPostDialogueWithResponseCode(reqType, reqBody, nil, http.StatusCreated)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Post("/repos/kryptonians/krypton/issues/1234/comments", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	addCommentErr := githubClient.AddComment(1234, "test msg")
	require.NoError(t, addCommentErr)
}

func TestGetAuthenticatedUser(t *testing.T) {
	r := chi.NewRouter()
	md := mockhttpclient.MockGetError("OK", http.StatusOK)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/user", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	_, getUserErr := githubClient.GetAuthenticatedUser()
	require.NoError(t, getUserErr)
}

func TestListOpenPullRequests(t *testing.T) {
	prNum1 := 1
	prNum2 := 101
	respBody := []byte(testutils.MarshalJSON(t, []*github.PullRequest{
		{Number: &prNum1},
		{Number: &prNum2},
	}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/pulls", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	prs, getPullErr := githubClient.ListOpenPullRequests()
	require.NoError(t, getPullErr)
	require.Equal(t, 2, len(prs))
	require.Equal(t, prNum1, prs[0].GetNumber())
	require.Equal(t, prNum2, prs[1].GetNumber())
}

func TestGetPullRequest(t *testing.T) {
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{State: &CLOSED_STATE}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/pulls/1234", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	pr, getPullErr := githubClient.GetPullRequest(1234)
	require.NoError(t, getPullErr)
	require.Equal(t, CLOSED_STATE, *pr.State)
}

func TestGetReference(t *testing.T) {
	testSHA := "xyz"
	testRef := "test-branch"
	testRepoOwner := "batman"
	testRepoName := "gotham"
	respBody := []byte(testutils.MarshalJSON(t, &github.Reference{Object: &github.GitObject{SHA: &testSHA}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get(fmt.Sprintf("/repos/%s/%s/git/refs/%s", testRepoOwner, testRepoName, url.QueryEscape(testRef)), md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), testRepoOwner, testRepoName, httpClient)
	require.NoError(t, err)
	ref, err := githubClient.GetReference(testRepoOwner, testRepoName, testRef)
	require.NoError(t, err)
	require.Equal(t, testSHA, *ref.Object.SHA)
}

func TestListMatchingReferences(t *testing.T) {
	testSHA1 := "abc"
	testSHA2 := "xyz"
	testRef := "test-branch"
	testRepoOwner := "batman"
	testRepoName := "gotham"
	retRef1 := github.Reference{Object: &github.GitObject{SHA: &testSHA1}}
	retRef2 := github.Reference{Object: &github.GitObject{SHA: &testSHA2}}
	respBody := []byte(testutils.MarshalJSON(t, []github.Reference{retRef1, retRef2}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get(fmt.Sprintf("/repos/%s/%s/git/refs/%s", testRepoOwner, testRepoName, url.QueryEscape(testRef)), md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), testRepoOwner, testRepoName, httpClient)
	require.NoError(t, err)
	retRefs, err := githubClient.ListMatchingReferences(testRepoOwner, testRepoName, testRef)
	require.NoError(t, err)
	require.Equal(t, 2, len(retRefs))
	require.Equal(t, testSHA1, *retRefs[0].Object.SHA)
	require.Equal(t, testSHA2, *retRefs[1].Object.SHA)
}

func TestDeleteReference(t *testing.T) {
	testRef := "test-branch"
	testRepoOwner := "batman"
	testRepoName := "gotham"
	r := chi.NewRouter()
	md := mockhttpclient.MockDeleteDialogueWithResponseCode("", nil, nil, http.StatusNoContent)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Delete(fmt.Sprintf("/repos/%s/%s/git/refs/%s", testRepoOwner, testRepoName, testRef), md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), testRepoOwner, testRepoName, httpClient)
	require.NoError(t, err)
	err = githubClient.DeleteReference(testRepoOwner, testRepoName, testRef)
	require.NoError(t, err)
}

func TestCreateReference(t *testing.T) {
	testSHA := "xyz"
	testRef := "test-branch"
	testRepoOwner := "batman"
	testRepoName := "gotham"
	reqBody := []byte(fmt.Sprintf(`{"ref":"refs/%s","sha":"%s"}
`, testRef, testSHA))
	r := chi.NewRouter()
	md := mockhttpclient.MockPostDialogueWithResponseCode("application/json", reqBody, nil, http.StatusCreated)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Post(fmt.Sprintf("/repos/%s/%s/git/refs", testRepoOwner, testRepoName), md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), testRepoOwner, testRepoName, httpClient)
	require.NoError(t, err)
	err = githubClient.CreateReference(testRepoOwner, testRepoName, testRef, testSHA)
	require.NoError(t, err)
}

func TestCreatePullRequest(t *testing.T) {
	reqType := "application/json"
	reqBody := []byte(`{"title":"title","head":"headBranch","base":"baseBranch","body":"testBody"}
`)
	number := 12345
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{Number: &number}))
	r := chi.NewRouter()
	md := mockhttpclient.MockPostDialogueWithResponseCode(reqType, reqBody, respBody, http.StatusCreated)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Post("/repos/kryptonians/krypton/pulls", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	pullRequest, createPullErr := githubClient.CreatePullRequest("title", "baseBranch", "headBranch", "testBody")
	require.NoError(t, createPullErr)
	require.Equal(t, number, *pullRequest.Number)
}

func TestMergePullRequest(t *testing.T) {
	reqType := "application/json"
	reqBody := []byte(`{"commit_message":"test comment","merge_method":"squash"}
`)
	r := chi.NewRouter()
	md := mockhttpclient.MockPutDialogue(reqType, reqBody, nil)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Put("/repos/kryptonians/krypton/pulls/1234/merge", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	mergePullErr := githubClient.MergePullRequest(1234, "test comment", "squash")
	require.NoError(t, mergePullErr)
}

func TestClosePullRequest(t *testing.T) {
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{State: &CLOSED_STATE}))
	reqType := "application/json"
	reqBody := []byte(`{"state":"closed"}
`)
	r := chi.NewRouter()
	md := mockhttpclient.MockPatchDialogue(reqType, reqBody, respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Patch("/repos/kryptonians/krypton/pulls/1234", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	pr, closePullErr := githubClient.ClosePullRequest(1234)
	require.NoError(t, closePullErr)
	require.Equal(t, CLOSED_STATE, *pr.State)
}

func TestGetIssues(t *testing.T) {
	id1 := int64(11)
	id2 := int64(22)
	issue1 := github.Issue{ID: &id1}
	issue2 := github.Issue{ID: &id2}
	respBody := []byte(testutils.MarshalJSON(t, []*github.Issue{&issue1, &issue2}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com"),
		mockhttpclient.QueryMatcher("labels", "label1,label2", "per_page", "123", "state", "open")).
		Get("/repos/kryptonians/krypton/issues", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	issues, getIssuesErr := githubClient.GetIssues(true, []string{"label1", "label2"}, 123)
	require.NoError(t, getIssuesErr)
	require.Equal(t, 2, len(issues))
	require.Equal(t, id1, issues[0].GetID())
	require.Equal(t, id2, issues[1].GetID())
}

func TestGetLabelsRequest(t *testing.T) {
	label1Name := "test1"
	label2Name := "test2"
	label1 := github.Label{Name: &label1Name}
	label2 := github.Label{Name: &label2Name}
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{Labels: []*github.Label{&label1, &label2}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/issues/1234", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	labels, getLabelsErr := githubClient.GetLabels(1234)
	require.NoError(t, getLabelsErr)
	require.Equal(t, []string{label1Name, label2Name}, labels)
}

func TestAddLabelRequest(t *testing.T) {
	label1Name := "test1"
	label2Name := "test2"
	label1 := github.Label{Name: &label1Name}
	label2 := github.Label{Name: &label2Name}
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{Labels: []*github.Label{&label1, &label2}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/issues/1234", md.ServeHTTP)

	patchRespBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{}))
	patchReqType := "application/json"
	patchReqBody := []byte(`{"labels":["test1","test2","test3"]}
`)
	patchMd := mockhttpclient.MockPatchDialogue(patchReqType, patchReqBody, patchRespBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Patch("/repos/kryptonians/krypton/issues/1234", patchMd.ServeHTTP)

	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	addLabelErr := githubClient.AddLabel(1234, "test3")
	require.NoError(t, addLabelErr)
}

func TestRemoveLabelRequest(t *testing.T) {
	label1Name := "test1"
	label2Name := "test2"
	label1 := github.Label{Name: &label1Name}
	label2 := github.Label{Name: &label2Name}
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{Labels: []*github.Label{&label1, &label2}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/issues/1234", md.ServeHTTP)

	patchRespBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{}))
	patchReqType := "application/json"
	patchReqBody := []byte(`{"labels":["test1"]}
`)
	patchMd := mockhttpclient.MockPatchDialogue(patchReqType, patchReqBody, patchRespBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Patch("/repos/kryptonians/krypton/issues/1234", patchMd.ServeHTTP)

	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	removeLabelErr1 := githubClient.RemoveLabel(1234, "test2")
	require.NoError(t, removeLabelErr1)
}

func TestReplaceLabelRequest(t *testing.T) {
	label1Name := "test1"
	label2Name := "test2"
	label1 := github.Label{Name: &label1Name}
	label2 := github.Label{Name: &label2Name}
	respBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{Labels: []*github.Label{&label1, &label2}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/issues/1234", md.ServeHTTP)

	patchRespBody := []byte(testutils.MarshalJSON(t, &github.PullRequest{}))
	patchReqType := "application/json"
	patchReqBody := []byte(`{"labels":["test2","test3"]}
`)
	patchMd := mockhttpclient.MockPatchDialogue(patchReqType, patchReqBody, patchRespBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Patch("/repos/kryptonians/krypton/issues/1234", patchMd.ServeHTTP)

	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	removeLabelErr := githubClient.ReplaceLabel(1234, "test1", "test3")
	require.NoError(t, removeLabelErr)
}

func TestGetChecksRequest(t *testing.T) {

	// Mock out check-runs call.
	checkID1 := int64(100)
	checkName1 := "check1"
	check1 := github.CheckRun{ID: &checkID1, Name: &checkName1, StartedAt: &github.Timestamp{Time: time.Now()}}
	respBody := []byte(testutils.MarshalJSON(t, &github.ListCheckRunsResults{CheckRuns: []*github.CheckRun{&check1}}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/commits/abcd/check-runs", md.ServeHTTP)

	// Mock out status call.
	checkID2 := int64(200)
	checkName2 := "check2"
	pendingState := "pending"
	repoStatusCheck2 := github.RepoStatus{ID: &checkID2, Context: &checkName2, State: &pendingState}
	statusRespBody := []byte(testutils.MarshalJSON(t, &github.CombinedStatus{Statuses: []github.RepoStatus{repoStatusCheck2}}))
	mdStatus := mockhttpclient.MockGetDialogue(statusRespBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/commits/abcd/status", mdStatus.ServeHTTP)

	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	checks, getChecksErr := githubClient.GetChecks("abcd")
	require.NoError(t, getChecksErr)
	require.Equal(t, 2, len(checks))
	require.Equal(t, checkID1, checks[0].ID)
	require.Equal(t, checkName1, checks[0].Name)
	require.Equal(t, checkID2, checks[1].ID)
	require.Equal(t, checkName2, checks[1].Name)
}

func TestReRequestLatestCheckSuite(t *testing.T) {

	// Mock out list check suites call.
	totalResults := int(1)
	checkSuiteID := int64(100)
	checkSuiteStatus := "failed"
	checkSuite := github.CheckSuite{ID: &checkSuiteID, Status: &checkSuiteStatus}
	respBody := []byte(testutils.MarshalJSON(t, &github.ListCheckSuiteResults{Total: &totalResults, CheckSuites: []*github.CheckSuite{&checkSuite}}))
	r := chi.NewRouter()
	listmd := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/commits/abcd/check-suites", listmd.ServeHTTP)

	// Mock out rerequest check suite call.
	rerequestmd := mockhttpclient.MockPostDialogueWithResponseCode("application/json", nil, nil, http.StatusCreated)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Post("/repos/kryptonians/krypton/check-suites/100/rerequest", rerequestmd.ServeHTTP)

	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	rerequestErr := githubClient.ReRequestLatestCheckSuite("abcd")
	require.NoError(t, rerequestErr)
}

func TestGetDescription(t *testing.T) {
	body := "test test test"
	respBody := []byte(testutils.MarshalJSON(t, &github.Issue{Body: &body}))
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("api.github.com")).
		Get("/repos/kryptonians/krypton/issues/12345", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	desc, err := githubClient.GetDescription(12345)
	require.NoError(t, err)
	require.Equal(t, body, desc)
}

func TestReadRawFileRequest(t *testing.T) {
	respBody := []byte(`abcd`)
	r := chi.NewRouter()
	md := mockhttpclient.MockGetDialogue(respBody)
	r.With(
		mockhttpclient.SchemeMatcher("https"),
		mockhttpclient.HostMatcher("raw.githubusercontent.com")).
		Get("/kryptonians/krypton/main//dummy/path/to/this.txt", md.ServeHTTP)
	httpClient := mockhttpclient.NewMuxClient(r)

	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	contents, readRawErr := githubClient.ReadRawFile(git.MainBranch, "/dummy/path/to/this.txt")
	require.NoError(t, readRawErr)
	require.Equal(t, "abcd", contents)
}

func TestGetFullHistoryUrl(t *testing.T) {
	httpClient := mockhttpclient.NewMuxClient(chi.NewRouter())
	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	fullHistoryUrl := githubClient.GetFullHistoryUrl("superman@krypton.com")
	require.Equal(t, "https://github.com/kryptonians/krypton/pulls/superman", fullHistoryUrl)
}

func TestGetPullRequestUrlBase(t *testing.T) {
	httpClient := mockhttpclient.NewMuxClient(chi.NewRouter())
	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	pullRequestUrlBase := githubClient.GetPullRequestUrlBase()
	require.Equal(t, "https://github.com/kryptonians/krypton/pull/", pullRequestUrlBase)
}

func TestGetIssueUrlBase(t *testing.T) {
	httpClient := mockhttpclient.NewMuxClient(chi.NewRouter())
	githubClient, err := NewGitHub(context.Background(), "kryptonians", "krypton", httpClient)
	require.NoError(t, err)
	issueUrlBase := githubClient.GetIssueUrlBase()
	require.Equal(t, "https://github.com/kryptonians/krypton/issues/", issueUrlBase)
}
