from prospector2.formatters.base import Formatter


__all__ = (
    'TextFormatter',
)


# pylint: disable=unnecessary-lambda


class TextFormatter(Formatter):
    summary_labels = (
        ('started', 'Started'),
        ('completed', 'Finished'),
        ('time_taken', 'Time Taken', lambda x: '%s seconds' % x),
        ('formatter', 'Formatter'),
        ('profiles', 'Profiles'),
        ('strictness', 'Strictness'),
        ('libraries', 'Libraries Used', lambda x: ', '.join(x)),
        ('tools', 'Tools Run', lambda x: ', '.join(x)),
        ('adaptors', 'Adaptors', lambda x: ', '.join(x)),
        ('message_count', 'Messages Found'),
        ('external_config', 'External Config'),
    )

    def render_summary(self):
        output = [
            'Check Information',
            '=================',
        ]

        label_width = max([len(label[1]) for label in self.summary_labels])

        for summary_label in self.summary_labels:
            key = summary_label[0]
            if key in self.summary:
                label = summary_label[1]
                if len(summary_label) > 2:
                    value = summary_label[2](self.summary[key])
                else:
                    value = self.summary[key]
                output.append(
                    ' %s: %s' % (
                        label.rjust(label_width),
                        value,
                    )
                )

        return '\n'.join(output)

    # pylint: disable=no-self-use
    def render_message(self, message):
        output = []

        if message.location.module:
            output.append('%s (%s):' % (
                message.location.module,
                message.location.path
            ))
        else:
            output.append('%s:' % message.location.path)

        output.append(
            '    L%s:%s %s: %s - %s' % (
                message.location.line or '-',
                message.location.character if message.location.character else '-',
                message.location.function,
                message.source,
                message.code,
            )
        )

        output.append('    %s' % message.message)

        return '\n'.join(output)

    def render_messages(self):
        output = [
            'Messages',
            '========',
            '',
        ]

        for message in self.messages:
            output.append(self.render_message(message))
            output.append('')

        return '\n'.join(output)

    def render_profile(self):
        output = [
            'Profile',
            '=======',
            '',
            self.profile.as_yaml().strip()
        ]

        return '\n'.join(output)

    def render(self, summary=True, messages=True, profile=False):
        output = []
        if messages and self.messages:  # if there are no messages, don't render an empty header
            output.append(self.render_messages())
        if profile:
            output.append(self.render_profile())
        if summary:
            output.append(self.render_summary())

        return '\n\n\n'.join(output) + '\n'
