#
# Copyright 2018 the original author or authors.
#
# 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.
#

"""Resource KV store - interface between Resource Manager and backend store."""
import structlog

from voltha.core.config.config_backend import ConsulStore
from voltha.core.config.config_backend import EtcdStore

# KV store uses this prefix to store resource info
PATH_PREFIX = 'resource_manager/{}/{}'


class ResourceKvStore(object):
    """Implements apis to store/get/remove resource in backend store."""

    def __init__(self, technology, device_id, backend, host, port):
        """
        Create ResourceKvStore object.

        Based on backend ('consul' and 'etcd' use the host and port
        to create the respective object.

        :param technology: PON technology
        :param device_id: OLT device id
        :param backend: Type of backend storage (etcd or consul)
        :param host: host ip info for backend storage
        :param port: port for the backend storage
        :raises exception when invalid backend store passed as an argument
        """
        # logger
        self._log = structlog.get_logger()

        path = PATH_PREFIX.format(technology, device_id)
        try:
            if backend == 'consul':
                self._kv_store = ConsulStore(host, port, path)
                self._recurse = '?recurse'
            elif backend == 'etcd':
                self._kv_store = EtcdStore(host, port, path)
                self._recurse = ''
            else:
                self._log.error('Invalid-backend')
                raise Exception("Invalid-backend-for-kv-store")
        except Exception as e:
            self._log.exception("exception-in-init")
            raise Exception(e)

    def update_to_kv_store(self, path, resource):
        """
        Update resource.

        :param path: path to update the resource
        :param resource: updated resource
        """
        try:
            self._kv_store[path] = str(resource)
            self._log.debug("Resource-updated-in-kv-store", path=path)
            return True
        except BaseException:
            self._log.exception("Resource-update-in-kv-store-failed",
                                path=path, resource=resource)
        return False

    def get_from_kv_store(self, path):
        """
        Get resource.

        :param path: path to get the resource
        """
        resource = None
        try:
            resource = self._kv_store[path]
            self._log.debug("Got-resource-from-kv-store", path=path)
        except KeyError:
            self._log.info("Resource-not-found-updating-resource",
                           path=path)
        except BaseException:
            self._log.exception("Getting-resource-from-kv-store-failed",
                                path=path)
        return resource

    def remove_from_kv_store(self, path):
        """
        Remove resource.

        :param path: path to remove the resource
        """
        path = path + self._recurse
        try:
            del self._kv_store[path]
            self._log.debug("Resource-deleted-in-kv-store", path=path)
            return True
        except BaseException:
            self._log.exception("Resource-delete-in-kv-store-failed",
                                path=path)
        return False
