"""Module containing the logic for our debugging logic."""
from __future__ import print_function

import json
import platform

import entrypoints


def print_information(
    option, option_string, value, parser, option_manager=None
):
    """Print debugging information used in bug reports.

    :param option:
        The optparse Option instance.
    :type option:
        optparse.Option
    :param str option_string:
        The option name
    :param value:
        The value passed to the callback parsed from the command-line
    :param parser:
        The optparse OptionParser instance
    :type parser:
        optparse.OptionParser
    :param option_manager:
        The Flake8 OptionManager instance.
    :type option_manager:
        flake8.options.manager.OptionManager
    """
    if not option_manager.registered_plugins:
        # NOTE(sigmavirus24): Flake8 parses options twice. The first time, we
        # will not have any registered plugins. We can skip this one and only
        # take action on the second time we're called.
        return
    print(json.dumps(information(option_manager), indent=2, sort_keys=True))
    raise SystemExit(False)


def information(option_manager):
    """Generate the information to be printed for the bug report."""
    return {
        "version": option_manager.version,
        "plugins": plugins_from(option_manager),
        "dependencies": dependencies(),
        "platform": {
            "python_implementation": platform.python_implementation(),
            "python_version": platform.python_version(),
            "system": platform.system(),
        },
    }


def plugins_from(option_manager):
    """Generate the list of plugins installed."""
    return [
        {
            "plugin": plugin.name,
            "version": plugin.version,
            "is_local": plugin.local,
        }
        for plugin in sorted(option_manager.registered_plugins)
    ]


def dependencies():
    """Generate the list of dependencies we care about."""
    return [{"dependency": "entrypoints", "version": entrypoints.__version__}]
