/*
 * Copyright 2020-present Open Networking Foundation
 *
 * 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 db holds utils for datastore implementation
package db

import (
	"context"
	"errors"

	"github.com/opencord/voltha-lib-go/v4/pkg/log"
)

// Read function reads key value pair from db/kvstore
func Read(ctx context.Context, key string) (string, error) {
	if kvClient != nil {
		logger.Debugw(ctx, "Reading-key-value-pair-from-kv-store", log.Fields{"key": key})
		kvPair, err := kvClient.client.Get(ctx, key)
		if err != nil {
			return "", err
		}
		if kvPair == nil {
			return "", errors.New("key not found")
		}
		return string(kvPair.Value.([]byte)), nil

	}
	logger.Errorw(ctx, "Reading-key-value-pair-in kv-store-failed-because-kvstore-not-initialised", log.Fields{"key": key})
	return "", errors.New("kvstore not initialised")
}

// ReadAll function reads all key value pair from db/kvstore
func ReadAll(ctx context.Context, keyPrefix string) (map[string]string, error) {
	keyValues := make(map[string]string)
	if kvClient != nil {
		logger.Debugw(ctx, "Reading-all-key-value-pairs-from-kv-store", log.Fields{"key-prefix": keyPrefix})
		kvPairs, err := kvClient.client.List(ctx, keyPrefix)
		if err != nil {
			return keyValues, err
		}
		if kvPairs == nil {
			return keyValues, errors.New("key not found")
		}

		for key, kvPair := range kvPairs {
			keyValues[key] = string(kvPair.Value.([]byte))
		}
		return keyValues, nil
	}
	logger.Errorw(ctx, "Reading-all-key-value-pair-in-kv-store-failed-because-kvstore-not-initialised", log.Fields{"key-prefix": keyPrefix})
	return keyValues, errors.New("kvstore not initialised")
}

// Del function deletes key value pair from db/kvstore
func Del(ctx context.Context, key string) error {
	if kvClient != nil {
		logger.Debugw(ctx, "Deleting-key-value-pair-from-kv-store", log.Fields{"key": key})
		return kvClient.client.Delete(ctx, key)
	}
	logger.Errorw(ctx, "Deleting-key-value-pair-in-kv-store-failed-because-kvstore-not-initialised", log.Fields{"key": key})
	return errors.New("kvstore not initialised")
}

// DelAll function deletes all key value pair from db/kvstore with provided key prefix
func DelAll(ctx context.Context, keyPrefix string) error {
	if kvClient != nil {
		logger.Debugw(ctx, "Deleting-all-key-value-pair-from-kv-store-with-prefix", log.Fields{"key-prefix": keyPrefix})
		return kvClient.client.DeleteWithPrefix(ctx, keyPrefix)
	}
	logger.Errorw(ctx, "Deleting-all-key-value-pair-in-kv-store-with-prefix-failed-because-kvstore-not-initialised", log.Fields{"key-prefix": keyPrefix})
	return errors.New("kvstore not initialised")
}

// Put function stores key value pair in db/kvstore
func Put(ctx context.Context, key string, val string) error {
	if kvClient != nil {
		logger.Debugw(ctx, "Storing-key-value-pair-in-kv-store", log.Fields{"key": key, "value": val})
		return kvClient.client.Put(ctx, key, val)
	}
	logger.Errorw(ctx, "Storing-key-value-pair-in-kv-store-failed-because-kvstore-not-initialised", log.Fields{"key": key, "value": val})
	return errors.New("kvstore not initialised")
}
