package apidVerifyApiKey

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

	"testing"
	"github.com/30x/apid"
	"github.com/30x/apid/factory"
	"io/ioutil"
	"net/http/httptest"
	"net/http"
	"os"
	"strconv"
	"github.com/apigee-labs/transicator/common"
)

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)
	insertTestData(db)
	testServer = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
		if req.URL.Path == apiPath {
			handleRequest(w, req)
		}
	}))
})

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 insertTestData(db apid.DB) {

	txn, err := db.Begin()
	Expect(err).ShouldNot(HaveOccurred())

	for i := 0; i < 10; i++ {
		var rows []common.Row
		srvItems := common.Row{}
		result := strconv.FormatInt(int64(i), 10)

		scv := &common.ColumnVal{
			Value: "api_product_" + result,
			Type:  1,
		}
		srvItems["id"] = scv

		scv = &common.ColumnVal{
			Value: "{/**, /test}",
			Type:  1,
		}
		srvItems["api_resources"] = scv

		scv = &common.ColumnVal{
			Value: "{Env_0, Env_1}",
			Type:  1,
		}
		srvItems["environments"] = scv

		scv = &common.ColumnVal{
			Value: "Org_0",
			Type:  1,
		}
		srvItems["_change_selector"] = scv

		scv = &common.ColumnVal{
			Value: "tenant_id_xxxx",
			Type:  1,
		}
		srvItems["tenant_id"] = scv
		rows = append(rows, srvItems)
		res := insertAPIproducts(rows, txn)
		Expect(res).Should(BeTrue())
	}

	for i := 0; i < 10; i++ {
		var rows []common.Row
		srvItems := common.Row{}
		result := strconv.FormatInt(int64(i), 10)

		scv := &common.ColumnVal{
			Value: "developer_id_" + result,
			Type:  1,
		}
		srvItems["id"] = scv

		scv = &common.ColumnVal{
			Value: "test@apigee.com",
			Type:  1,
		}
		srvItems["email"] = scv

		scv = &common.ColumnVal{
			Value: "Active",
			Type:  1,
		}
		srvItems["status"] = scv

		scv = &common.ColumnVal{
			Value: "Apigee",
			Type:  1,
		}
		srvItems["firstName"] = scv

		scv = &common.ColumnVal{
			Value: "Google",
			Type:  1,
		}
		srvItems["lastName"] = scv

		scv = &common.ColumnVal{
			Value: "Org_0",
			Type:  1,
		}
		srvItems["_change_selector"] = scv

		scv = &common.ColumnVal{
			Value: "tenant_id_xxxx",
			Type:  1,
		}
		srvItems["tenant_id"] = scv

		rows = append(rows, srvItems)
		res := insertDevelopers(rows, txn)
		Expect(res).Should(BeTrue())
	}

	var j, k int
	for i := 0; i < 10; i++ {
		resulti := strconv.FormatInt(int64(i), 10)
		for j = k; j < 10 + k; j++ {
			var rows []common.Row

			srvItems := common.Row{}
			resultj := strconv.FormatInt(int64(j), 10)

			scv := &common.ColumnVal{
				Value: "application_id_" + resultj,
				Type:  1,
			}
			srvItems["id"] = scv

			scv = &common.ColumnVal{
				Value: "developer_id_" + resulti,
				Type:  1,
			}
			srvItems["developer_id"] = scv

			scv = &common.ColumnVal{
				Value: "approved",
				Type:  1,
			}
			srvItems["status"] = scv

			scv = &common.ColumnVal{
				Value: "http://apigee.com",
				Type:  1,
			}
			srvItems["callback_url"] = scv

			scv = &common.ColumnVal{
				Value: "Org_0",
				Type:  1,
			}
			srvItems["_change_selector"] = scv

			scv = &common.ColumnVal{
				Value: "tenant_id_xxxx",
				Type:  1,
			}
			srvItems["tenant_id"] = scv
			rows = append(rows, srvItems)
			res := insertApplications(rows, txn)
			Expect(res).Should(BeTrue())
		}
		k = j
	}

	for i := 0; i < 10; i++ {
		var rows []common.Row
		srvItems := common.Row{}
		result := strconv.FormatInt(int64(i), 10)

		scv := &common.ColumnVal{
			Value: "app_credential_" + result,
			Type:  1,
		}
		srvItems["id"] = scv

		scv = &common.ColumnVal{
			Value: "application_id_" + result,
			Type:  1,
		}
		srvItems["app_id"] = scv

		scv = &common.ColumnVal{
			Value: "approved",
			Type:  1,
		}
		srvItems["status"] = scv

		scv = &common.ColumnVal{
			Value: "Org_0",
			Type:  1,
		}
		srvItems["_change_selector"] = scv

		scv = &common.ColumnVal{
			Value: "tenant_id_xxxx",
			Type:  1,
		}
		srvItems["tenant_id"] = scv
		rows = append(rows, srvItems)
		res := insertCredentials(rows, txn)
		Expect(res).Should(BeTrue())
	}

	for i := 0; i < 10; i++ {
		var rows []common.Row
		srvItems := common.Row{}
		result := strconv.FormatInt(int64(i), 10)

		scv := &common.ColumnVal{
			Value: "api_product_" + result,
			Type:  1,
		}
		srvItems["apiprdt_id"] = scv

		scv = &common.ColumnVal{
			Value: "application_id_" + result,
			Type:  1,
		}
		srvItems["app_id"] = scv

		scv = &common.ColumnVal{
			Value: "app_credential_" + result,
			Type:  1,
		}
		srvItems["appcred_id"] = scv
		scv = &common.ColumnVal{
			Value: "approved",
			Type:  1,
		}
		srvItems["status"] = scv
		scv = &common.ColumnVal{
			Value: "Org_0",
			Type:  1,
		}
		srvItems["_change_selector"] = scv

		scv = &common.ColumnVal{
			Value: "tenant_id_xxxx",
			Type:  1,
		}
		srvItems["tenant_id"] = scv
		rows = append(rows, srvItems)
		res := insertAPIProductMappers(rows, txn)
		Expect(res).Should(BeTrue())
	}
	txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) " +
		"VALUES" +
		"($1,$2,$3,$4,$5,$6)",
		"ABCDE",
		"some_cluster_id",
		"some_cluster_id",
		"tenant_id_0",
		"test_org0",
		"Env_0",
	);
	log.Info("Inserted DATA_SCOPE for test")
	txn.Commit()
	var count int64
	db.QueryRow("select count(*) from data_scope").Scan(&count);
	log.Info("Found ", count)

}
