# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.

"""
Pylint plugin which tells Pylint how to work with driver classes.

At the moment, it supports the following scenarios:

1. It dynamically assigns "connection" class attribute on the NodeDriver
   class instance based on the value of "connectionCls" NodeDriver class
   attribute.
"""

from astroid import MANAGER
from astroid import scoped_nodes
from astroid import node_classes


def register(linter):
    pass


def transform(cls):
    if 'NodeDriver' in cls.basenames:
        fqdn = cls.qname()
        module_name, _ = fqdn.rsplit('.', 1)

        # Assign connection class variable on it which is otherwise assigned
        # dynamically at the run time
        if 'connectionCls' not in cls.locals:
            # connectionCls not explicitly defined on the driver class
            return

        connection_cls_name = cls.locals['connectionCls'][0].parent.value.name
        connection_cls_node = MANAGER.ast_from_module_name(module_name).lookup(connection_cls_name)[1]

        if len(connection_cls_node) >= 1:
            if isinstance(connection_cls_node[0], node_classes.ImportFrom):
                # Connection class is imported and not directly defined in the driver class module
                connection_cls_module_name = connection_cls_node[0].modname
                connection_cls_node = MANAGER.ast_from_module_name(connection_cls_module_name).lookup(connection_cls_name)[1][0]

                cls.instance_attrs['connection'] = [connection_cls_node.instantiate_class()]
            else:
                # Connection class is defined directly in the driver module
                cls.instance_attrs['connection'] = [connection_cls_node[0].instantiate_class()]
            return


MANAGER.register_transform(scoped_nodes.Class, transform)
