# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import attr

from ..result import Issue


class CompactFormatter:
    """Formatter for compact output.

    This formatter prints one error per line, mimicking the
    eslint 'compact' formatter.
    """

    # If modifying this format, please also update the vim errorformats in editor.py
    fmt = "{path}: line {lineno}{column}, {level} - {message} ({rule})"

    def __init__(self, summary=True):
        self.summary = summary

    def __call__(self, result):
        message = []
        num_problems = 0
        for path, errors in sorted(result.issues.items()):
            num_problems += len(errors)
            for err in errors:
                assert isinstance(err, Issue)

                d = attr.asdict(err)
                d["column"] = ", col %s" % d["column"] if d["column"] else ""
                d["level"] = d["level"].capitalize()
                d["rule"] = d["rule"] or d["linter"]
                message.append(self.fmt.format(**d))

        if self.summary and num_problems:
            message.append(
                "\n{} problem{}".format(num_problems, "" if num_problems == 1 else "s")
            )
        return "\n".join(message)
