#
# Copyright 2017 Andreas Florath (andreas@florath.net)
#
# 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.
#
# Scan the element directory, looks for element  dependencies and
# writes them out when the directive
#   .. element_deps::
# is used.
# This was developed only for internal use and must be called
# from the source top directory.

from diskimage_builder.element_dependencies import _find_all_elements
from diskimage_builder.paths import get_path

from docutils.parsers.rst import Directive
import os

all_elements = _find_all_elements(get_path("elements"))


def make_dep_list(title, deps):
    lines = []
    lines.append(title)
    lines.append("+" * len(title))
    for dep in sorted(deps):
        lines.append("* :doc:`../%s/README`" % dep)
    lines.append('')  # careful to end with a blank line
    return lines


class ElementDepsDirective(Directive):

    # this enables content in the directive
    has_content = True

    def run(self):
        source = self.state_machine.input_lines.source(
            self.lineno - self.state_machine.input_offset - 1)
        # Extract the element from the source attribute of the document
        element_name = os.path.basename(os.path.dirname(
            self.state_machine.document.attributes['source']))

        lines = ["Element Dependencies",
                 "--------------------"]

        # This should not fail -- sphinx would be finding an element
        # that dib doesn't know about?
        element = all_elements[element_name]
        if element.depends:
            lines.extend(make_dep_list("Uses", element.depends))
        if element.r_depends:
            lines.extend(make_dep_list("Used by", element.r_depends))

        self.state_machine.insert_input(lines, source)

        return []


def setup(app):
    app.add_directive('element_deps', ElementDepsDirective)