// 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 common

import (
	"github.com/apid/apid-core"
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
	"io/ioutil"
	"reflect"
	"sort"
	"sync"
)

const fileDataTest = "data_test.sql"

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

	Context("DB", func() {
		var dataTestTempDir string
		var testDbMan *DbManager
		BeforeEach(func() {
			var err error
			dataTestTempDir, err = ioutil.TempDir(testTempDirBase, "sqlite3")
			Expect(err).NotTo(HaveOccurred())
			services.Config().Set("local_storage_path", dataTestTempDir)

			testDbMan = &DbManager{
				Data:  services.Data(),
				DbMux: sync.RWMutex{},
			}
			testDbMan.SetDbVersion(dataTestTempDir)
			Expect(testDbMan.GetDbVersion()).Should(Equal(dataTestTempDir))
			setupTestDb(testDbMan.GetDb())
		})

		It("should get kms attributes", func() {
			attributes := testDbMan.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))
		})

		It("Should get all orgs", func() {
			orgs, err := testDbMan.GetOrgs()
			Expect(err).Should(Succeed())
			sort.Strings(orgs)
			Expect(orgs).Should(Equal([]string{"apid-haoming", "apid-test"}))
		})

		It("Add indexes", func() {
			Expect(AddIndexes(testDbMan.GetDbVersion())).Should(Succeed())
		})

	})

	Context("Validate common.JsonToStringArray", func() {

		It("should transform simple valid json", func() {
			array := JsonToStringArray("[\"test-1\", \"test-2\"]")
			Expect(reflect.DeepEqual(array, []string{"test-1", "test-2"})).Should(BeTrue())
		})
		It("should transform simple single valid json", func() {
			array := JsonToStringArray("[\"test-1\"]")
			Expect(reflect.DeepEqual(array, []string{"test-1"})).Should(BeTrue())
		})
		It("should transform simple fake json", func() {
			s := JsonToStringArray("{test-1,test-2}")
			Expect(reflect.DeepEqual(s, []string{"test-1", "test-2"})).Should(BeTrue())
		})
		It("should transform simple single valued fake json", func() {
			s := JsonToStringArray("{test-1}")
			Expect(reflect.DeepEqual(s, []string{"test-1"})).Should(BeTrue())
		})
		It("space between fields considered as valid char", func() {
			s := JsonToStringArray("{test-1, test-2}")
			Expect(reflect.DeepEqual(s, []string{"test-1", " test-2"})).Should(BeTrue())
		})
		It("remove only last braces", func() {
			s := JsonToStringArray("{test-1,test-2}}")
			Expect(reflect.DeepEqual(s, []string{"test-1", "test-2}"})).Should(BeTrue())
		})

	})
})

func setupTestDb(db apid.DB) {
	bytes, err := ioutil.ReadFile(fileDataTest)
	Expect(err).Should(Succeed())
	query := string(bytes)
	_, err = db.Exec(query)
	Expect(err).Should(Succeed())
}
