package apidVerifyApiKey

import (
	"encoding/json"
	"github.com/30x/apid"
	"github.com/apigee-labs/transicator/common"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"net/url"
)

var _ = Describe("listener", func() {

	It("should store data from ApigeeSync in the database", func(done Done) {

		var event = common.ChangeList{}
		var event2 = common.ChangeList{}

		/* API Product */
		srvItems := common.Row{
			"id": {
				Value: "ch_api_product_0",
				Type:  1,
			},
			"apid_resources": {
				Value: "{}",
				Type:  1,
			},
			"environments": {
				Value: "{Env_0, Env_1}",
				Type:  1,
			},
			"tenant_id": {
				Value: "tenant_id_0",
				Type:  1,
			},
			"_change_selector": {
				Value: "test_org0",
				Type:  1,
			},
		}

		/* DEVELOPER */
		devItems := common.Row{
			"id": {
				Value: "ch_developer_id_0",
				Type:  1,
			},
			"status": {
				Value: "Active",
				Type:  1,
			},
			"tenant_id": {
				Value: "tenant_id_0",
				Type:  1,
			},
			"_change_selector": {
				Value: "test_org0",
				Type:  1,
			},
		}

		/* APP */
		appItems := common.Row{
			"id": {
				Value: "ch_application_id_0",
				Type:  1,
			},
			"developer_id": {
				Value: "ch_developer_id_0",
				Type:  1,
			},
			"status": {
				Value: "Approved",
				Type:  1,
			},
			"tenant_id": {
				Value: "tenant_id_0",
				Type:  1,
			},
			"_change_selector": {
				Value: "test_org0",
				Type:  1,
			},
		}

		/* CRED */
		credItems := common.Row{
			"id": {
				Value: "ch_app_credential_0",
				Type:  1,
			},
			"app_id": {
				Value: "ch_application_id_0",
				Type:  1,
			},
			"tenant_id": {
				Value: "tenant_id_0",
				Type:  1,
			},
			"status": {
				Value: "Approved",
				Type:  1,
			},
			"_change_selector": {
				Value: "test_org0",
				Type:  1,
			},
		}

		/* APP_CRED_APIPRD_MAPPER */
		mpItems := common.Row{
			"apiprdt_id": {
				Value: "ch_api_product_0",
				Type:  1,
			},
			"app_id": {
				Value: "ch_application_id_0",
				Type:  1,
			},
			"appcred_id": {
				Value: "ch_app_credential_0",
				Type:  1,
			},
			"status": {
				Value: "Approved",
				Type:  1,
			},
			"_change_selector": {
				Value: "test_org0",
				Type:  1,
			},
		}

		event.Changes = []common.Change{
			{
				Table:     "kms.api_product",
				NewRow:    srvItems,
				Operation: 1,
			},
			{
				Table:     "kms.developer",
				NewRow:    devItems,
				Operation: 1,
			},
			{
				Table:     "kms.app",
				NewRow:    appItems,
				Operation: 1,
			},
			{
				Table:     "kms.app_credential",
				NewRow:    credItems,
				Operation: 1,
			},
			{
				Table:     "kms.app_credential_apiproduct_mapper",
				NewRow:    mpItems,
				Operation: 1,
			},
		}

		event2.Changes = []common.Change{
			{
				Table:     "kms.api_product",
				OldRow:    srvItems,
				Operation: 3,
			},
			{
				Table:     "kms.developer",
				OldRow:    devItems,
				Operation: 3,
			},
			{
				Table:     "kms.app",
				OldRow:    appItems,
				Operation: 3,
			},
			{
				Table:     "kms.app_credential",
				OldRow:    credItems,
				Operation: 3,
			},
			{
				Table:     "kms.app_credential_apiproduct_mapper",
				OldRow:    mpItems,
				Operation: 3,
			},
		}
		h := &test_handler{
			"checkDatabase post Insertion",
			func(e apid.Event) {
				defer GinkgoRecover()

				// ignore the first event, let standard listener process it
				changeSet := e.(*common.ChangeList)
				if len(changeSet.Changes) > 0 {
					return
				}
				v := url.Values{
					"key": []string{"ch_app_credential_0"},
					"uriPath": []string{"/test"},
					"scopeuuid": []string{"XYZ"},
					"action": []string{"verify"},
				}
				rsp, err := verifyAPIKey(v)
				Expect(err).ShouldNot(HaveOccurred())
				var respj kmsResponseSuccess
				json.Unmarshal(rsp, &respj)
				Expect(respj.Type).Should(Equal("APIKeyContext"))
				Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_0"))
				close(done)
			},
		}

		apid.Events().Listen("ApigeeSync", h)
		apid.Events().Emit("ApigeeSync", &event)
		apid.Events().Emit("ApigeeSync", &event2)
		apid.Events().Emit("ApigeeSync", &event)
		apid.Events().Emit("ApigeeSync", &common.ChangeList{})
	})

})

type test_handler struct {
	description string
	f           func(event apid.Event)
}

func (t *test_handler) String() string {
	return t.description
}

func (t *test_handler) Handle(event apid.Event) {
	t.f(event)
}
