# Copyright 2020 K Sai Kiran (Tata Elxsi)
#
# 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.

__author__ = "K Sai Kiran <saikiran.k@tataelxsi.co.in>"
__date__ = "$28-Apr-2020 23:59:59$"

import asyncio
import aiohttp
from http import HTTPStatus
import json
import logging
import time
from uuid import uuid4


class NotificationException(Exception):
    """
    Notification Exception
    """

    def __init__(self, message: str, http_code: int = HTTPStatus.BAD_REQUEST) -> None:
        """
        Constructor of notification exception
        :param message: String text containing exception details.
        :param http_code: HTTP status code of exception.
        """
        self.http_code = http_code
        Exception.__init__(self, message)


class NotificationBase:

    response_models = None
    # Common HTTP payload header for all notifications.
    payload_header = {"Content-Type": "application/json", "Accept": "application/json"}

    def __init__(self, db) -> None:
        """
        Constructor of NotificationBase class.
        :param db: Database handler.
        """
        self.db = db
        self.logger = logging.getLogger("nbi.notifications")
        self.subscriber_collection = None

    def get_models(self) -> dict:
        """
        Returns the SOL005 model of notification class
        :param None
        :return: dict of SOL005 data model
        """
        return NotificationBase.response_models

    def get_subscribers(self, **kwargs) -> NotificationException:
        """
        Method should be implemented by all notification subclasses
        :param kwargs: any keyword arguments needed for db query.
        :return: List of subscribers
        """
        raise NotificationException(
            "Method get_subscribers() is not implemented",
            http_code=HTTPStatus.NOT_IMPLEMENTED,
        )

    @staticmethod
    def _get_basic_auth(username: str, password: str) -> tuple:
        return aiohttp.BasicAuth(username, password)

    def _decrypt_password(
        self, hashed: str, salt: str, schema_version: str = "1.1"
    ) -> str:
        return self.db.decrypt(hashed, schema_version, salt=salt)

    def get_payload(self, meta_notification: dict) -> dict:
        """
        Generates SOL005 compliant payload structure and returns them in dictionary.
        :param meta_notification: notification meta data which needs to be formatted as SOL005 compliant
        :return: A dictionary which is SOL005 compliant.
        """
        model_name = meta_notification["notificationType"]
        response_models = self.get_models()
        if not response_models or not response_models.get(model_name):
            raise NotificationException(
                "Response model {} is not defined.".format(model_name),
                HTTPStatus.NOT_IMPLEMENTED,
            )
        model_keys = response_models[model_name]
        payload = dict.fromkeys(model_keys, "N/A")
        notification_keys = set(meta_notification.keys())
        for model_key in model_keys.intersection(notification_keys):
            payload[model_key] = meta_notification[model_key]
        self.logger.debug(
            "Payload generated for subscriber: {} for {}".format(
                payload["subscriptionId"], payload["notificationType"]
            )
        )
        return payload

    async def send_notifications(
        self, subscribers: list, loop: asyncio.AbstractEventLoop = None
    ):
        """
        Generate tasks for all notification for an event.
        :param subscribers: A list of subscribers who want to be notified for event.
        :param loop: Event loop object.
        """
        notifications = []
        for subscriber in subscribers:
            # Notify without auth
            if not subscriber.get("authentication"):
                notifications.append(
                    {
                        "headers": self.payload_header,
                        "payload": self.get_payload(subscriber),
                        "CallbackUri": subscriber["CallbackUri"],
                    }
                )
            elif subscriber["authentication"]["authType"] == "basic":
                salt = subscriber["subscriptionId"]
                hashed_password = subscriber["authentication"]["paramsBasic"][
                    "password"
                ]
                password = self._decrypt_password(hashed_password, salt)
                auth_basic = self._get_basic_auth(
                    subscriber["authentication"]["paramsBasic"]["userName"], password
                )
                notifications.append(
                    {
                        "headers": self.payload_header,
                        "payload": self.get_payload(subscriber),
                        "auth_basic": auth_basic,
                        "CallbackUri": subscriber["CallbackUri"],
                    }
                )
            # TODO add support for AuthType OAuth and TLS after support is added in subscription.
            else:
                self.logger.debug(
                    "Subscriber {} can not be notified. {} notification auth type is not implemented".format(
                        subscriber["subscriptionId"],
                        subscriber["authentication"]["authType"],
                    )
                )

        if notifications:
            tasks = []
            async with aiohttp.ClientSession(loop=loop) as session:
                for notification in notifications:
                    tasks.append(
                        asyncio.ensure_future(
                            self.send_notification(session, notification, loop=loop),
                            loop=loop,
                        )
                    )
                await asyncio.gather(*tasks, loop=loop)

    async def send_notification(
        self,
        session: aiohttp.ClientSession,
        notification: dict,
        loop: asyncio.AbstractEventLoop = None,
        retry_count: int = 5,
        timeout: float = 5.0,
    ):
        """
        Performs HTTP Post request to notify subscriber. In case if for any reason notification is not sent successfully
        after maximum number of reties, then notification is dropped.
        :param session: An aiohttp client session object to maintain http session.
        :param notification: A dictionary containing all necessary data to make POST request.
        :param loop: Event loop object.
        :param retry_count: An integer specifying the maximum number of reties for a notification.
        :param timeout: A float representing client timeout of each HTTP request.
        """
        backoff_delay = 1
        while retry_count > 0:
            try:
                async with session.post(
                    url=notification["CallbackUri"],
                    headers=notification["headers"],
                    auth=notification.get("auth_basic", None),
                    data=json.dumps(notification["payload"]),
                    timeout=timeout,
                ) as resp:
                    # self.logger.debug("Notification response: {}".format(resp.status))
                    if resp.status == HTTPStatus.NO_CONTENT:
                        self.logger.debug(
                            "Notification sent successfully to subscriber {}".format(
                                notification["payload"]["subscriptionId"]
                            )
                        )
                    else:
                        error_text = "Erroneous response code: {}, ".format(resp.status)
                        error_text += await resp.text()
                        raise NotificationException(error_text)
                return True
            except Exception as e:
                error_text = type(e).__name__ + ": " + str(e)
                self.logger.debug(
                    "Unable to send notification to subscriber {}. Details: {}".format(
                        notification["payload"]["subscriptionId"], error_text
                    )
                )
                error_detail = {
                    "error": type(e).__name__,
                    "error_text": str(e),
                    "timestamp": time.time(),
                }
                if "error_details" in notification["payload"].keys():
                    notification["payload"]["error_details"].append(error_detail)
                else:
                    notification["payload"]["error_details"] = [error_detail]
                retry_count -= 1
                backoff_delay *= 2
                self.logger.debug(
                    "Retry Notification for subscriber: {} after backoff delay: {} seconds.".format(
                        notification["payload"]["subscriptionId"], backoff_delay
                    )
                )
                await asyncio.sleep(backoff_delay, loop=loop)
        # Dropping notification
        self.logger.debug(
            "Notification {} sent failed to subscriber:{}.".format(
                notification["payload"]["notificationType"],
                notification["payload"]["subscriptionId"],
            )
        )
        return False


class NsLcmNotification(NotificationBase):

    # SOL005 response model for nslcm notifications
    response_models = {
        "NsLcmOperationOccurrenceNotification": {
            "id",
            "nsInstanceId",
            "nsLcmOpOccId",
            "operation",
            "notificationType",
            "subscriptionId",
            "timestamp",
            "notificationStatus",
            "operationState",
            "isAutomaticInvocation",
            "affectedVnf",
            "affectedVl",
            "affectedVnffg",
            "affectedNs",
            "affectedSap",
            "error",
            "_links",
        },
        "NsIdentifierCreationNotification": {
            "notificationType",
            "subscriptionId",
            "timestamp",
            "nsInstanceId",
            "_links",
        },
        "NsIdentifierDeletionNotification": {
            "notificationType",
            "subscriptionId",
            "timestamp",
            "nsInstanceId",
            "_links",
        },
        "NsChangeNotification": {
            "nsInstanceId",
            "nsComponentType",
            "nsComponentId",
            "lcmOpOccIdImpactngNsComponent",
            "lcmOpNameImpactingNsComponent",
            "lcmOpOccStatusImpactingNsComponent",
            "notificationType",
            "subscriptionId",
            "timeStamp",
            "error",
            "_links",
        },
    }

    def __init__(self, db) -> None:
        """
        Constructor of NsLcmNotification class.
        :param db: Database handler.
        """
        super().__init__(db)
        self.subscriber_collection = "mapped_subscriptions"

    def get_models(self) -> dict:
        """
        Returns the SOL005 model of notification class
        :param None
        :return: dict of SOL005 data model
        """
        return NsLcmNotification.response_models

    @staticmethod
    def _format_nslcm_subscribers(subscribers: list, event_details: dict) -> list:
        """
        Formats the raw event details from kakfa message and subscriber details.
        :param subscribers: A list of subscribers whom the event needs to be notified.
        :param event_details: A dict containing all meta data of event.
        :return:
        """
        notification_id = str(uuid4())
        event_timestamp = event_details["params"]["startTime"]
        resource_links = event_details["params"]["links"]
        event_operation = event_details["command"]
        for key in ["_admin", "_id", "id", "links"]:
            event_details["params"].pop(key, None)
        for subscriber in subscribers:
            subscriber["id"] = notification_id
            subscriber["timestamp"] = event_timestamp
            subscriber["_links"] = resource_links
            subscriber["subscriptionId"] = subscriber["reference"]
            subscriber["operation"] = event_operation
            del subscriber["reference"]
            del subscriber["_id"]
            subscriber.update(event_details["params"])
        return subscribers

    def get_subscribers(
        self,
        nsd_id: str,
        ns_instance_id: str,
        command: str,
        op_state: str,
        event_details: dict,
    ) -> list:
        """
        Queries database and returns list of subscribers.
        :param nsd_id: NSD id of an NS whose lifecycle has changed. (scaled, terminated. etc)
        :param ns_instance_id: NS instance id an NS whose lifecycle has changed.
        :param command: the command for event.
        :param op_state: the operation state of NS.
        :param event_details: dict containing raw data of event occured.
        :return: List of interested subscribers for occurred event.
        """
        notification_type = [
            "NsLcmOperationOccurrenceNotification",
            "NsChangeNotification",
            "NsIdentifierCreationNotification",
            "NsIdentifierDeletionNotification"
        ]
        filter_q = {
            "identifier": [nsd_id, ns_instance_id],
            "operationStates": ["ANY"],
            "operationTypes": ["ANY"],
            "notificationType": notification_type
            }
        if op_state:
            filter_q["operationStates"].append(op_state)
        if command:
            filter_q["operationTypes"].append(command)
        # self.logger.debug("Db query is: {}".format(filter_q))
        subscribers = []
        try:
            subscribers = self.db.get_list(self.subscriber_collection, filter_q)
            subscribers = self._format_nslcm_subscribers(subscribers, event_details)
        except Exception as e:
            error_text = type(e).__name__ + ": " + str(e)
            self.logger.debug("Error getting nslcm subscribers: {}".format(error_text))
        finally:
            return subscribers


class VnfLcmNotification(NotificationBase):
    # SOL003 response model for vnflcm notifications
    response_models = {
        "VnfLcmOperationOccurrenceNotification": {
            "id",
            "notificationType",
            "subscriptionId",
            "timeStamp",
            "notificationStatus",
            "operationState",
            "vnfInstanceId",
            "operation",
            "isAutomaticInvocation",
            "vnfLcmOpOccId",
            "affectedVnfcs",
            "affectedVirtualLinks",
            "affectedExtLinkPorts",
            "affectedVirtualStorages",
            "changedInfo",
            "changedExtConnectivity",
            "modificationsTriggeredByVnfPkgChange",
            "error",
            "_links"
        },
        "VnfIdentifierCreationNotification": {
            "id",
            "notificationType",
            "subscriptionId",
            "timeStamp",
            "vnfInstanceId",
            "_links"
        },
        "VnfIdentifierDeletionNotification": {
            "id",
            "notificationType",
            "subscriptionId",
            "timeStamp",
            "vnfInstanceId",
            "_links"
        },
    }

    def __init__(self, db) -> None:
        """
        Constructor of VnfLcmNotification class.
        :param db: Database handler.
        """
        super().__init__(db)
        self.subscriber_collection = "mapped_subscriptions"

    def get_models(self) -> dict:
        """
        Returns the SOL003 model of notification class
        :param None
        :return: dict of SOL003 data model
        """
        return self.response_models

    def _format_vnflcm_subscribers(self, subscribers: list, event_details: dict) -> list:
        """
        Formats the raw event details from kafka message and subscriber details.
        :param subscribers: A list of subscribers whom the event needs to be notified.
        :param event_details: A dict containing all meta data of event.
        :return:
        """
        notification_id = str(uuid4())
        event_timestamp = time.time()
        event_operation = event_details["command"]
        for subscriber in subscribers:
            subscriber["id"] = notification_id
            subscriber["timeStamp"] = event_timestamp
            subscriber["subscriptionId"] = subscriber["reference"]
            subscriber["operation"] = event_operation
            del subscriber["reference"]
            del subscriber["_id"]
            subscriber.update(event_details["params"])
        return subscribers

    def get_subscribers(self, vnfd_id: str, vnf_instance_id: str, command: str, op_state: str,
                        event_details: dict) -> list:
        """
        Queries database and returns list of subscribers.
        :param vnfd_id: Vnfd id of a VNF whose lifecycle has changed. (instantiated, scaled, terminated. etc)
        :param vnf_instance_id: Vnf instance id of a VNF whose lifecycle has changed.
        :param command: the command for event.
        :param op_state: the operation state of VNF.
        :param event_details: dict containing raw data of event occurred.
        :return: List of interested subscribers for occurred event.
        """
        notification_type = [
            "VnfIdentifierCreationNotification",
            "VnfLcmOperationOccurrenceNotification",
            "VnfIdentifierDeletionNotification"
        ]
        filter_q = {
            "identifier": [vnfd_id, vnf_instance_id],
            "operationStates": ["ANY"],
            "operationTypes": ["ANY"],
            "notificationType": notification_type
        }
        if op_state:
            filter_q["operationStates"].append(op_state)
        if command:
            filter_q["operationTypes"].append(command)
        subscribers = []
        try:
            subscribers = self.db.get_list(self.subscriber_collection, filter_q)
            subscribers = self._format_vnflcm_subscribers(subscribers, event_details)
        except Exception as e:
            error_text = type(e).__name__ + ": " + str(e)
            self.logger.debug("Error getting vnflcm subscribers: {}".format(error_text))
        finally:
            return subscribers


class NsdNotification(NotificationBase):
    def __init__(self, db):
        """
        Constructor of the class
        """
        super().__init__(db)
        # TODO will update this once support is there from subscription
        self.response_models = {}
        self.subscriber_collection = None


class VnfdNotification(NotificationBase):
    def __init__(self, db):
        """
        Constructor of the class
        """
        super().__init__(db)
        # TODO will update this once support is there from subscription
        self.response_models = {}
        self.subscriber_collection = None
