import os

from platypush.context import get_plugin


def get_all_plugins():
    return get_plugin('inspect').get_all_plugins().output


def get_all_backends():
    return get_plugin('inspect').get_all_backends().output


def get_all_events():
    return get_plugin('inspect').get_all_events().output


def get_all_responses():
    return get_plugin('inspect').get_all_responses().output


# noinspection DuplicatedCode
def generate_plugins_doc():
    plugins_index = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'plugins.rst')
    plugins_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'platypush', 'plugins')
    all_plugins = sorted(plugin for plugin in get_all_plugins().keys())

    for plugin in all_plugins:
        plugin_file = os.path.join(plugins_dir, plugin + '.rst')
        if not os.path.exists(plugin_file):
            plugin = 'platypush.plugins.' + plugin
            header = '``{}``'.format(plugin)
            divider = '=' * len(header)
            body = '\n.. automodule:: {}\n    :members:\n'.format(plugin)
            out = '\n'.join([header, divider, body])

            with open(plugin_file, 'w') as f:
                f.write(out)

    with open(plugins_index, 'w') as f:
        f.write('''
Plugins
=======

.. toctree::
    :maxdepth: 2
    :caption: Plugins:

''')

        for plugin in all_plugins:
            f.write('    platypush/plugins/' + plugin + '.rst\n')


# noinspection DuplicatedCode
def generate_backends_doc():
    backends_index = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'backends.rst')
    backends_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'platypush', 'backend')
    all_backends = sorted(backend for backend in get_all_backends().keys())

    for backend in all_backends:
        backend_file = os.path.join(backends_dir, backend + '.rst')
        if not os.path.exists(backend_file):
            backend = 'platypush.backend.' + backend
            header = '``{}``'.format(backend)
            divider = '=' * len(header)
            body = '\n.. automodule:: {}\n    :members:\n'.format(backend)
            out = '\n'.join([header, divider, body])

            with open(backend_file, 'w') as f:
                f.write(out)

    with open(backends_index, 'w') as f:
        f.write('''
Backends
========

.. toctree::
    :maxdepth: 2
    :caption: Backends:

''')

        for backend in all_backends:
            f.write('    platypush/backend/' + backend + '.rst\n')


# noinspection DuplicatedCode
def generate_events_doc():
    events_index = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'events.rst')
    events_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'platypush', 'events')
    all_events = sorted(event for event in get_all_events().keys())

    for event in all_events:
        event_file = os.path.join(events_dir, event[len('platypush.message.event.'):] + '.rst')
        if not os.path.exists(event_file):
            header = '``{}``'.format(event)
            divider = '=' * len(header)
            body = '\n.. automodule:: {}\n    :members:\n'.format(event)
            out = '\n'.join([header, divider, body])

            with open(event_file, 'w') as f:
                f.write(out)

    with open(events_index, 'w') as f:
        f.write('''
Events
======

.. toctree::
    :maxdepth: 2
    :caption: Events:

''')

        for event in all_events:
            f.write('    platypush/events/' + event[len('platypush.message.event.'):] + '.rst\n')


# noinspection DuplicatedCode
def generate_responses_doc():
    responses_index = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'responses.rst')
    responses_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'docs', 'source', 'platypush', 'responses')
    all_responses = sorted(response for response in get_all_responses().keys())

    for response in all_responses:
        response_file = os.path.join(responses_dir, response[len('platypush.message.response.'):] + '.rst')
        if not os.path.exists(response_file):
            header = '``{}``'.format(response)
            divider = '=' * len(header)
            body = '\n.. automodule:: {}\n    :members:\n'.format(response)
            out = '\n'.join([header, divider, body])

            with open(response_file, 'w') as f:
                f.write(out)

    with open(responses_index, 'w') as f:
        f.write('''
Responses
=========

.. toctree::
    :maxdepth: 2
    :caption: Responses:

''')

        for response in all_responses:
            f.write('    platypush/responses/' + response[len('platypush.message.response.'):] + '.rst\n')


generate_plugins_doc()
generate_backends_doc()
generate_events_doc()
generate_responses_doc()


# vim:sw=4:ts=4:et:
