# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from logging import NullHandler, getLogger

from six import text_type

logger = getLogger(__name__)
logger.addHandler(NullHandler())


class Reportable(object):
    """Reportable abstract class."""

    def __init__(self, name, description=None, reportable=True):
        """Constructor."""
        self.name = name
        self._description = description
        self.reportable = reportable

    @property
    def description(self):
        """Rule description."""
        return self._description or self.name

    def report(self, value, context):
        """Report unknown value."""
        if not value or not self.reportable:
            return

        value = text_type(value)
        if 'report' in context:
            report_map = context['report'].setdefault(self.description, {})
            if value not in report_map:
                report_map[value] = context['path']
        logger.info('Invalid %s: %r', self.description, value)