// Copyright 2023 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.

package database

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

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

var integration = flag.Bool("integration", false, "test with respect to current contents of vulndb")

func TestNewWriteLoadValidate(t *testing.T) {
	newDB, err := New(testOSV1, testOSV2, testOSV3)
	if err != nil {
		t.Fatal(err)
	}
	tmpDir := t.TempDir()
	if err = newDB.Write(tmpDir); err != nil {
		t.Fatal(err)
	}
	loaded, err := Load(tmpDir)
	if err != nil {
		t.Fatal(err)
	}
	if diff := cmp.Diff(newDB, loaded); diff != "" {
		t.Errorf("new/write/load mismatch (-new, +loaded):\n%s", diff)
	}
	if err := Validate(tmpDir, tmpDir); err != nil {
		t.Error(err)
	}
}

func TestFromRepoWriteLoadValidate(t *testing.T) {
	ctx := context.Background()
	testRepo, err := gitrepo.ReadTxtarRepo(vulndbTxtar, jan2002)
	if err != nil {
		t.Fatal(err)
	}

	fromRepo, err := FromRepo(ctx, testRepo)
	if err != nil {
		t.Fatal(err)
	}
	tmpDir := t.TempDir()
	if err = fromRepo.Write(tmpDir); err != nil {
		t.Fatal(err)
	}
	loaded, err := Load(tmpDir)
	if err != nil {
		t.Fatal(err)
	}
	if diff := cmp.Diff(fromRepo, loaded); diff != "" {
		t.Errorf("fromRepo/write/load mismatch (-fromRepo, +loaded):\n%s", diff)
	}
	if err := Validate(tmpDir, tmpDir); err != nil {
		t.Error(err)
	}
}

func TestIntegration(t *testing.T) {
	if !*integration {
		t.Skip("Skipping integration tests, use flag -integration to run")
	}

	moveToVulnDBRoot(t)

	ctx := context.Background()

	repo, err := gitrepo.Open(ctx, ".")
	if err != nil {
		t.Fatal(err)
	}

	dir := t.TempDir()
	created, err := FromRepo(ctx, repo)
	if err != nil {
		t.Fatal(err)
	}

	if err := created.Write(dir); err != nil {
		t.Fatal(err)
	}

	loaded, err := Load(dir)
	if err != nil {
		t.Fatal(err)
	}

	if diff := cmp.Diff(created, loaded); diff != "" {
		t.Errorf("unexpected diff: (-created,+loaded):\n%s", diff)
	}

	if err := Validate(dir, dir); err != nil {
		t.Error(err)
	}
}

func moveToVulnDBRoot(t *testing.T) {
	// Store current working directory and move into vulndb/ folder.
	wd, err := os.Getwd()
	if err != nil {
		t.Fatal(err)
	}
	if err := os.Chdir("../.."); err != nil {
		t.Fatal(err)
	}

	// Restore state from before test.
	t.Cleanup(func() {
		if err = os.Chdir(wd); err != nil {
			t.Log(err)
		}
	})
}
