// 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
// +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)
	}
}
