#
# 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)
        try:
            if backend == 'consul':
                self._kv_store = ConsulStore(host, port, path)
            elif backend == 'etcd':
                self._kv_store = EtcdStore(host, port, path)
            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
        """
        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
