package apidVerifyApiKey

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"

	"github.com/30x/apid-core"
	"github.com/30x/apid-core/factory"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"os"
	"testing"
)

var (
	testTempDir string
	testServer  *httptest.Server
)

var _ = BeforeSuite(func() {
	apid.Initialize(factory.DefaultServicesFactory())

	config := apid.Config()

	var err error
	testTempDir, err = ioutil.TempDir("", "api_test")
	Expect(err).NotTo(HaveOccurred())

	config.Set("data_path", testTempDir)

	apid.InitializePlugins("")

	db, err := apid.Data().DB()
	Expect(err).NotTo(HaveOccurred())
	setDB(db)
	createTables(db)
	createApidClusterTables(db)
	addScopes(db)
	testServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
		if req.URL.Path == apiPath {
			handleRequest(w, req)
		}
	}))

	createTestData(db)
})

var _ = AfterSuite(func() {
	apid.Events().Close()
	if testServer != nil {
		testServer.Close()
	}
	os.RemoveAll(testTempDir)
})

func TestVerifyAPIKey(t *testing.T) {
	RegisterFailHandler(Fail)
	RunSpecs(t, "VerifyAPIKey Suite")
}

func createTestData(db apid.DB) {
	txn, err := db.Begin()
	Expect(err).ShouldNot(HaveOccurred())
	// api products
	for i := 0; i < 10; i++ {
		generateTestApiProduct(i, txn)
	}
	// developers
	for i := 0; i < 10; i++ {
		generateTestDeveloper(i, txn)
	}

	// application
	var j, k int
	for i := 0; i < 10; i++ {
		for j = k; j < 10+k; j++ {
			generateTestApp(j, i, txn)
		}
		k = j
	}
	// app credentials
	for i := 0; i < 10; i++ {
		generateTestAppCreds(i, txn)
	}
	// api product mapper
	for i := 0; i < 10; i++ {
		generateTestApiProductMapper(i, txn)
	}

	// Following are data for company
	// api products
	for i := 100; i < 110; i++ {
		generateTestApiProduct(i, txn)
	}

	// companies
	for i := 100; i < 110; i++ {
		generateTestCompany(i, txn)
	}

	// company developers
	for i := 100; i < 110; i++ {
		generateTestCompanyDeveloper(i, txn)
	}

	// application
	k = 100
	for i := 100; i < 110; i++ {
		for j = k; j < 100+k; j++ {
			generateTestAppCompany(j, i, txn)
		}
		k = j
	}
	// app credentials
	for i := 100; i < 110; i++ {
		generateTestAppCreds(i, txn)
	}
	// api product mapper
	for i := 100; i < 110; i++ {
		generateTestApiProductMapper(i, txn)
	}

	txn.Commit()
	var count int64
	db.QueryRow("select count(*) from EDGEX_DATA_SCOPE").Scan(&count)
	log.Info("Found ", count)
}
