from __future__ import annotations


from docutils import nodes
from sphinx.application import Sphinx
from sphinx.util.docutils import SphinxDirective, SphinxRole
from sphinx.util.typing import ExtensionMetadata
from sphinx.directives.code import LiteralInclude, container_wrapper

import requests

class ExtInclude(LiteralInclude):
    """A directive to include code that comes from an url

    Sample use::

        .. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_010/firefox/00-proxy.yml
           :linenos:
           :language: yaml
           :caption: this is a interesting code

    - parameter required
    - linenos, language and caption are optionnal.

    :default language: yaml
    :default caption: extinclude parameter (url)

    """

    def run(self) -> list[nodes.Node]:
        url = self.arguments[0]
        headers = {
            'accept': 'application/text',
            'Content-Type': 'application/text',
            }
        response = requests.get(url, headers=headers)
        #paragraph_node = nodes.paragraph(text=f'hello {self.arguments[0]}!')
        code = response.text

        literal = nodes.literal_block(code, code)
        if 'language' in self.options:
            literal['language'] = self.options['language']
        else:
            literal['language'] = 'yaml'
        literal['linenos'] = 'linenos' in self.options
        if 'caption' in self.options:
            caption = self.options.get('caption')
        else:
            caption = url
        literal['caption'] = caption
        if 'name' in self.options:
            literal['name'] = self.options.get('name')
        literal = container_wrapper(self, literal, caption)
        self.add_name(literal)

        return [literal]
        #paragraph_node = nodes.paragraph(text=content.text)
        #return [paragraph_node]


def setup(app: Sphinx) -> ExtensionMetadata:

    app.add_directive('extinclude', ExtInclude)

    return {
        'version': '0.1',
        'parallel_read_safe': True,
        'parallel_write_safe': True,
    }