// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package apidVerifyApiKey

import (
	"github.com/30x/apid-core"
	"github.com/30x/apid-core/factory"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"io/ioutil"
	"sync"
)

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

	Context("query db to get api key details", func() {
		var dataTestTempDir string
		var dbMan *dbManager
		var _ = BeforeEach(func() {
			var err error
			dataTestTempDir, err = ioutil.TempDir(testTempDirBase, "sqlite3")

			s := factory.DefaultServicesFactory()
			apid.Initialize(s)
			config := apid.Config()
			config.Set("local_storage_path", dataTestTempDir)

			Expect(err).NotTo(HaveOccurred())

			dbMan = &dbManager{
				data:  s.Data(),
				dbMux: sync.RWMutex{},
			}
			dbMan.setDbVersion(dataTestTempDir)

		})

		It("should get compnay getApiKeyDetails for happy path", func() {
			setupApikeyCompanyTestDb(dbMan.db)

			dataWrapper := VerifyApiKeyRequestResponseDataWrapper{
				verifyApiKeyRequest: VerifyApiKeyRequest{
					OrganizationName: "apigee-mcrosrvc-client0001",
					Key:              "63tHSNLKJkcc6GENVWGT1Zw5gek7kVJ0",
				},
			}
			err := dbMan.getApiKeyDetails(&dataWrapper)
			Expect(err).NotTo(HaveOccurred())

			Expect(dataWrapper.ctype).Should(BeEquivalentTo("company"))
			Expect(dataWrapper.tenant_id).Should(BeEquivalentTo("bc811169"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.ClientId.Status).Should(BeEquivalentTo("APPROVED"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.ClientId.ClientSecret).Should(BeEquivalentTo("Ui8dcyGW3lA04YdX"))

			Expect(dataWrapper.tempDeveloperDetails.Id).Should(BeEquivalentTo("7834c683-9453-4389-b816-34ca24dfccd9"))
			Expect(dataWrapper.tempDeveloperDetails.UserName).Should(BeEquivalentTo("East India Company"))
			Expect(dataWrapper.tempDeveloperDetails.FirstName).Should(BeEquivalentTo("DevCompany"))
			Expect(dataWrapper.tempDeveloperDetails.LastName).Should(BeEquivalentTo(""))
			Expect(dataWrapper.tempDeveloperDetails.Email).Should(BeEquivalentTo(""))
			Expect(dataWrapper.tempDeveloperDetails.Status).Should(BeEquivalentTo("ACTIVE"))
			Expect(dataWrapper.tempDeveloperDetails.CreatedAt).Should(BeEquivalentTo("2017-08-05 19:54:12.359+00:00"))
			Expect(dataWrapper.tempDeveloperDetails.CreatedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(dataWrapper.tempDeveloperDetails.LastmodifiedAt).Should(BeEquivalentTo("2017-08-05 19:54:12.359+00:00"))
			Expect(dataWrapper.tempDeveloperDetails.LastmodifiedBy).Should(BeEquivalentTo("defaultUser"))

			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Id).Should(BeEquivalentTo("d371f05a-7c04-430c-b12d-26cf4e4d5d65"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Name).Should(BeEquivalentTo("CompApp2"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.AccessType).Should(BeEquivalentTo("READ"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CallbackUrl).Should(BeEquivalentTo("www.apple.com"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.DisplayName).Should(BeEquivalentTo(""))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Status).Should(BeEquivalentTo("APPROVED"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.AppFamily).Should(BeEquivalentTo("default"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Company).Should(BeEquivalentTo("7834c683-9453-4389-b816-34ca24dfccd9"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CreatedAt).Should(BeEquivalentTo("2017-08-07 17:00:54.25+00:00"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CreatedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.LastmodifiedAt).Should(BeEquivalentTo("2017-08-07 17:09:08.259+00:00"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.LastmodifiedBy).Should(BeEquivalentTo("defaultUser"))

		})

		It("should get developer ApiKeyDetails - happy path", func() {
			setupApikeyDeveloperTestDb(dbMan.db)

			dataWrapper := VerifyApiKeyRequestResponseDataWrapper{
				verifyApiKeyRequest: VerifyApiKeyRequest{
					OrganizationName: "apigee-mcrosrvc-client0001",
					Key:              "63tHSNLKJkcc6GENVWGT1Zw5gek7kVJ0",
				},
			}
			err := dbMan.getApiKeyDetails(&dataWrapper)
			Expect(err).NotTo(HaveOccurred())

			Expect(dataWrapper.ctype).Should(BeEquivalentTo("developer"))
			Expect(dataWrapper.tenant_id).Should(BeEquivalentTo("bc811169"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.ClientId.Status).Should(BeEquivalentTo("APPROVED"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.ClientId.ClientSecret).Should(BeEquivalentTo("Ui8dcyGW3lA04YdX"))

			Expect(dataWrapper.tempDeveloperDetails.Id).Should(BeEquivalentTo("209ffd18-37e9-4a67-9e30-a5c40a534b6c"))
			Expect(dataWrapper.tempDeveloperDetails.UserName).Should(BeEquivalentTo("wilson"))
			Expect(dataWrapper.tempDeveloperDetails.FirstName).Should(BeEquivalentTo("Woodre"))
			Expect(dataWrapper.tempDeveloperDetails.LastName).Should(BeEquivalentTo("Wilson"))
			Expect(dataWrapper.tempDeveloperDetails.Email).Should(BeEquivalentTo("developer@apigee.com"))
			Expect(dataWrapper.tempDeveloperDetails.Status).Should(BeEquivalentTo("ACTIVE"))
			Expect(dataWrapper.tempDeveloperDetails.CreatedAt).Should(BeEquivalentTo("2017-08-08 17:24:09.008+00:00"))
			Expect(dataWrapper.tempDeveloperDetails.CreatedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(dataWrapper.tempDeveloperDetails.LastmodifiedAt).Should(BeEquivalentTo("2017-08-08 17:24:09.008+00:00"))
			Expect(dataWrapper.tempDeveloperDetails.LastmodifiedBy).Should(BeEquivalentTo("defaultUser"))

			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Id).Should(BeEquivalentTo("d371f05a-7c04-430c-b12d-26cf4e4d5d65"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Name).Should(BeEquivalentTo("DeveloperApp"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.AccessType).Should(BeEquivalentTo("READ"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CallbackUrl).Should(BeEquivalentTo("www.apple.com"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.DisplayName).Should(BeEquivalentTo(""))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Status).Should(BeEquivalentTo("APPROVED"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.AppFamily).Should(BeEquivalentTo("default"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.Company).Should(BeEquivalentTo(""))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CreatedAt).Should(BeEquivalentTo("2017-08-07 17:00:54.25+00:00"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.CreatedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.LastmodifiedAt).Should(BeEquivalentTo("2017-08-07 17:09:08.259+00:00"))
			Expect(dataWrapper.verifyApiKeySuccessResponse.App.LastmodifiedBy).Should(BeEquivalentTo("defaultUser"))

		})

		It("should throw error when apikey not found", func() {

			setupApikeyCompanyTestDb(dbMan.db)
			dataWrapper := VerifyApiKeyRequestResponseDataWrapper{
				verifyApiKeyRequest: VerifyApiKeyRequest{
					OrganizationName: "apigee-mcrosrvc-client0001",
					Key:              "invalid-Jkcc6GENVWGT1Zw5gek7kVJ0",
				},
			}
			err := dbMan.getApiKeyDetails(&dataWrapper)
			Expect(err).ShouldNot(BeNil())
			Expect(err.Error()).Should(BeEquivalentTo("InvalidApiKey"))
		})

		It("should get api products ", func() {

			setupApikeyCompanyTestDb(dbMan.db)

			apiProducts := dbMan.getApiProductsForApiKey("63tHSNLKJkcc6GENVWGT1Zw5gek7kVJ0", "bc811169")
			Expect(len(apiProducts)).Should(BeEquivalentTo(1))

			Expect(apiProducts[0].Id).Should(BeEquivalentTo("24987a63-edb9-4d6b-9334-87e1d70df8e3"))
			Expect(apiProducts[0].Name).Should(BeEquivalentTo("KeyProduct4"))
			Expect(apiProducts[0].DisplayName).Should(BeEquivalentTo("Sandbox Diamond"))
			Expect(apiProducts[0].Status).Should(BeEquivalentTo(""))
			Expect(apiProducts[0].QuotaTimeunit).Should(BeEquivalentTo(""))
			Expect(apiProducts[0].QuotaInterval).Should(BeEquivalentTo(0))
			Expect(apiProducts[0].QuotaLimit).Should(BeEquivalentTo(""))

			Expect(apiProducts[0].Resources).Should(BeEquivalentTo([]string{"/zoho", "/twitter", "/nike"}))
			Expect(apiProducts[0].Apiproxies).Should(BeEquivalentTo([]string{"DevApplication", "KeysApplication"}))
			Expect(apiProducts[0].Environments).Should(BeEquivalentTo([]string{"test"}))
			Expect(apiProducts[0].Company).Should(BeEquivalentTo(""))
			Expect(len(apiProducts[0].Attributes)).Should(BeEquivalentTo(0))

			Expect(apiProducts[0].CreatedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(apiProducts[0].CreatedAt).Should(BeEquivalentTo("2017-08-08 02:53:32.726+00:00"))
			Expect(apiProducts[0].LastmodifiedBy).Should(BeEquivalentTo("defaultUser"))
			Expect(apiProducts[0].LastmodifiedAt).Should(BeEquivalentTo("2017-08-08 02:53:32.726+00:00"))

		})

		It("should return empty array when no api products found", func() {

			setupApikeyCompanyTestDb(dbMan.db)
			apiProducts := dbMan.getApiProductsForApiKey("invalid-LKJkcc6GENVWGT1Zw5gek7kVJ0", "bc811169")
			Expect(len(apiProducts)).Should(BeEquivalentTo(0))

		})

		It("should get kms attributes", func() {

			setupKmsAttributesdata(dbMan.db)
			attributes := dbMan.getKmsAttributes("bc811169", "40753e12-a50a-429d-9121-e571eb4e43a9", "85629786-37c5-4e8c-bb45-208f3360d005", "50321842-d6ee-4e92-91b9-37234a7920c1", "test-invalid")
			Expect(len(attributes)).Should(BeEquivalentTo(3))
			Expect(len(attributes["40753e12-a50a-429d-9121-e571eb4e43a9"])).Should(BeEquivalentTo(1))
			Expect(len(attributes["85629786-37c5-4e8c-bb45-208f3360d005"])).Should(BeEquivalentTo(2))
			Expect(len(attributes["50321842-d6ee-4e92-91b9-37234a7920c1"])).Should(BeEquivalentTo(5))
			Expect(len(attributes["test-invalid"])).Should(BeEquivalentTo(0))

		})

	})
})
