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() {

	Context("KMS create/updates verification via changes", func() {
		It("Create KMS tables via changes, and Verify via verifyApiKey", func(done Done) {
			var event = common.ChangeList{}
			closed := 0
			/* API Product */
			srvItems := common.Row{
				"id": {
					Value: "ch_api_product_2",
				},
				"api_resources": {
					Value: "{}",
				},
				"environments": {
					Value: "{Env_0, Env_1}",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
				"_change_selector": {
					Value: "test_org0",
				},
			}

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

			companyItems := common.Row{
				"id": {
					Value: "ch_company_id_2",
				},
				"status": {
					Value: "Active",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
				"_change_selector": {
					Value: "test_org0",
				},
				"name": {
					Value: "test_company_name0",
				},
				"display_name": {
					Value: "test_company_display_name0",
				},
			}

			companyDeveloperItems := common.Row{
				"id": {
					Value: "ch_developer_id_2",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
				"_change_selector": {
					Value: "test_org0",
				},
				"company_id": {
					Value: "ch_company_id_2",
				},
				"developer_id": {
					Value: "ch_developer_id_2",
				},
			}

			/* APP */
			appItems := common.Row{
				"id": {
					Value: "ch_application_id_2",
				},
				"developer_id": {
					Value: "ch_developer_id_2",
				},
				"status": {
					Value: "Approved",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
				"_change_selector": {
					Value: "test_org0",
				},
			}

			/* CRED */
			credItems := common.Row{
				"id": {
					Value: "ch_app_credential_2",
				},
				"app_id": {
					Value: "ch_application_id_2",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
				"status": {
					Value: "Approved",
				},
				"_change_selector": {
					Value: "test_org0",
				},
			}

			/* APP_CRED_APIPRD_MAPPER */
			mpItems := common.Row{
				"apiprdt_id": {
					Value: "ch_api_product_2",
				},
				"app_id": {
					Value: "ch_application_id_2",
				},
				"appcred_id": {
					Value: "ch_app_credential_2",
				},
				"status": {
					Value: "Approved",
				},
				"_change_selector": {
					Value: "test_org0",
				},
				"tenant_id": {
					Value: "tenant_id_0",
				},
			}

			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,
				},
				{
					Table:     "kms.company",
					NewRow:    companyItems,
					Operation: 1,
				},
				{
					Table:     "kms.company_developer",
					NewRow:    companyDeveloperItems,
					Operation: 1,
				},
			}

			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 || closed == 1 {
						return
					}
					v := url.Values{
						"key":       []string{"ch_app_credential_2"},
						"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_2"))
					closed = 1
					close(done)
				},
			}

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

	It("Modify tables in KMS tables, and verify via verifyApiKey", func(done Done) {
		closed := 0
		var event = common.ChangeList{}
		var event2 = common.ChangeList{}

		/* Orig data */
		/* API Product */
		srvItemsOld := common.Row{
			"id": {
				Value: "ch_api_product_0",
			},
			"api_resources": {
				Value: "{}",
			},
			"environments": {
				Value: "{Env_0, Env_1}",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
		}

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

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

		companyItemsOld := common.Row{
			"id": {
				Value: "ch_company_id_0",
			},
			"status": {
				Value: "Active",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"name": {
				Value: "test_company_name0",
			},
			"display_name": {
				Value: "test_company_display_name0",
			},
		}

		companyDeveloperItemsOld := common.Row{
			"id": {
				Value: "ch_developer_id_0",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"company_id": {
				Value: "ch_company_id_0",
			},
			"developer_id": {
				Value: "ch_developer_id_0",
			},
		}

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

		/* APP_CRED_APIPRD_MAPPER */
		mpItemsOld := common.Row{
			"apiprdt_id": {
				Value: "ch_api_product_0",
			},
			"app_id": {
				Value: "ch_application_id_0",
			},
			"appcred_id": {
				Value: "ch_app_credential_0",
			},
			"status": {
				Value: "Approved",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
		}

		/* New to be replaced data */
		/* API PRODUCT */
		srvItemsNew := common.Row{
			"id": {
				Value: "ch_api_product_1",
			},
			"api_resources": {
				Value: "{}",
			},
			"environments": {
				Value: "{Env_0, Env_1}",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
		}

		/* DEVELOPER */
		devItemsNew := common.Row{
			"id": {
				Value: "ch_developer_id_1",
			},
			"status": {
				Value: "Active",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
		}

		companyItemsNew := common.Row{
			"id": {
				Value: "ch_company_id_1",
			},
			"status": {
				Value: "Active",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"name": {
				Value: "test_company_name0",
			},
			"display_name": {
				Value: "test_company_display_name0",
			},
		}

		companyDeveloperItemsNew := common.Row{
			"id": {
				Value: "ch_developer_id_1",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"company_id": {
				Value: "ch_company_id_1",
			},
			"developer_id": {
				Value: "ch_developer_id_1",
			},
		}

		/* APP */
		appItemsNew := common.Row{
			"id": {
				Value: "ch_application_id_1",
			},
			"developer_id": {
				Value: "ch_developer_id_1",
			},
			"status": {
				Value: "Approved",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"_change_selector": {
				Value: "test_org0",
			},
		}

		/* CRED */
		credItemsNew := common.Row{
			"id": {
				Value: "ch_app_credential_1",
			},
			"app_id": {
				Value: "ch_application_id_1",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
			"status": {
				Value: "Approved",
			},
			"_change_selector": {
				Value: "test_org0",
			},
		}

		/* APP_CRED_APIPRD_MAPPER */
		mpItemsNew := common.Row{
			"apiprdt_id": {
				Value: "ch_api_product_1",
			},
			"app_id": {
				Value: "ch_application_id_1",
			},
			"appcred_id": {
				Value: "ch_app_credential_1",
			},
			"status": {
				Value: "Approved",
			},
			"_change_selector": {
				Value: "test_org0",
			},
			"tenant_id": {
				Value: "tenant_id_0",
			},
		}

		event.Changes = []common.Change{
			{
				Table:     "kms.api_product",
				NewRow:    srvItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.developer",
				NewRow:    devItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.company",
				NewRow:    companyItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.company_developer",
				NewRow:    companyDeveloperItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.app",
				NewRow:    appItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.app_credential",
				NewRow:    credItemsOld,
				Operation: 1,
			},
			{
				Table:     "kms.app_credential_apiproduct_mapper",
				NewRow:    mpItemsOld,
				Operation: 1,
			},
		}

		event2.Changes = []common.Change{
			{
				Table:     "kms.api_product",
				OldRow:    srvItemsOld,
				NewRow:    srvItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.developer",
				OldRow:    devItemsOld,
				NewRow:    devItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.company",
				OldRow:    companyItemsOld,
				NewRow:    companyItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.company_developer",
				OldRow:    companyDeveloperItemsOld,
				NewRow:    companyDeveloperItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.app",
				OldRow:    appItemsOld,
				NewRow:    appItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.app_credential",
				OldRow:    credItemsOld,
				NewRow:    credItemsNew,
				Operation: 2,
			},
			{
				Table:     "kms.app_credential_apiproduct_mapper",
				OldRow:    mpItemsOld,
				NewRow:    mpItemsNew,
				Operation: 2,
			},
		}

		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 || closed == 1 {
					return
				}
				v := url.Values{
					"key":       []string{"ch_app_credential_1"},
					"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_1"))
				closed = 1
				close(done)
			},
		}

		apid.Events().Listen("ApigeeSync", h)
		apid.Events().Emit("ApigeeSync", &event)
		apid.Events().Emit("ApigeeSync", &event2)
		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)
}

func addScopes(db apid.DB) {
	txn, _ := db.Begin()
	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_xxxx",
		"test_org0",
		"Env_0",
	)
	txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) "+
		"VALUES"+
		"($1,$2,$3,$4,$5,$6)",
		"XYZ",
		"test_org0",
		"somecluster_id",
		"tenant_id_0",
		"test_org0",
		"Env_0",
	)
	log.Info("Inserted DATA_SCOPE for test")
	txn.Commit()
}
