// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build go1.17

package issues

import (
	"context"
	"flag"
	"fmt"
	"os"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	"golang.org/x/vulndb/internal/gitrepo"
)

var (
	githubRepo  = flag.String("repo", "", "GitHub repo (in form owner/repo) to test issues")
	githubToken = flag.String("ghtoken", os.Getenv("VULN_GITHUB_ACCESS_TOKEN"), "GitHub access token")
)

func diffIssue(want, got *Issue) string {
	return cmp.Diff(want, got,
		cmpopts.IgnoreFields(Issue{}, "CreatedAt"))
}
func diffIssues(want, got []*Issue) string {
	byTitle := func(a, b *Issue) bool { return a.Title < b.Title }
	return cmp.Diff(want, got, cmpopts.SortSlices(byTitle),
		cmpopts.IgnoreFields(Issue{}, "CreatedAt"))
}

func TestRealClient(t *testing.T) {
	t.Run("github", func(t *testing.T) {
		if *githubRepo == "" {
			t.Skip("skipping: no -repo flag")
		}
		if *githubRepo == "golang/vulndb" {
			t.Skip("Do not use x/vulndb as the test repo. Create a personal test repo instead.")
		}
		owner, repo, err := gitrepo.ParseGitHubRepo(*githubRepo)
		if err != nil {
			t.Fatal(err)
		}
		if *githubToken == "" {
			t.Fatal("need -ghtoken")
		}
		testClient(t, NewClient(context.Background(), &Config{Owner: owner, Repo: repo, Token: *githubToken}))
	})
}

func testClient(t *testing.T, c *Client) {
	ctx := context.Background()
	iss := &Issue{
		Title:  "vuln worker test",
		Body:   "test of go.googlesource.com/vulndb/internal/issues",
		Labels: []string{"testing"},
		State:  "open",
	}
	iss2 := &Issue{
		Title:  "vuln worker test2",
		Body:   "test of go.googlesource.com/vulndb/internal/issues",
		Labels: []string{"testing", "other"},
		State:  "open",
	}

	num, err := c.CreateIssue(ctx, iss)
	iss.Number = num
	if err != nil {
		t.Fatal(err)
	}
	gotExists, err := c.IssueExists(ctx, num)
	if err != nil {
		t.Fatal(err)
	}
	if !gotExists {
		t.Error("created issue doesn't exist")
	}
	gotIss, err := c.Issue(ctx, num)
	if err != nil {
		t.Fatal(err)
	}
	if diff := diffIssue(iss, gotIss); diff != "" {
		fmt.Printf("%v", *gotIss)
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}
	num2, err := c.CreateIssue(ctx, iss2)
	iss2.Number = num2
	if err != nil {
		t.Fatal(err)
	}

	want := []*Issue{iss, iss2}
	got, err := c.Issues(ctx, IssuesOptions{Labels: []string{"testing"}})
	if err != nil {
		t.Fatal(err)
	}

	if diff := diffIssues(want, got); diff != "" {
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}
	want = []*Issue{iss2}
	got, err = c.Issues(ctx, IssuesOptions{Labels: []string{"other"}})
	if err != nil {
		t.Fatal(err)
	}

	if diff := diffIssues(want, got); diff != "" {
		t.Errorf("mismatch (-want, +got):\n%s", diff)
	}
}
