# 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/.

from collections import (
    defaultdict,
    namedtuple,
)

from mozlog.structuredlog import log_levels

RunSummary = namedtuple("RunSummary",
                        ("unexpected_statuses",
                         "expected_statuses",
                         "log_level_counts",
                         "action_counts"))

class StatusHandler(object):
    """A handler used to determine an overall status for a test run according
    to a sequence of log messages."""

    def __init__(self):
        # The count of each type of unexpected result status (includes tests and subtests)
        self.unexpected_statuses = defaultdict(int)
        # The count of each type of expected result status (includes tests and subtests)
        self.expected_statuses = defaultdict(int)
        # The count of actions logged
        self.action_counts = defaultdict(int)
        # The count of messages logged at each log level
        self.log_level_counts = defaultdict(int)


    def __call__(self, data):
        action = data['action']
        self.action_counts[action] += 1

        if action == 'log':
            self.log_level_counts[data['level']] += 1

        if action in ('test_status', 'test_end'):
            status = data['status']
            if 'expected' in data:
                self.unexpected_statuses[status] += 1
            else:
                self.expected_statuses[status] += 1


    def summarize(self):
        return RunSummary(
            dict(self.unexpected_statuses),
            dict(self.expected_statuses),
            dict(self.log_level_counts),
            dict(self.action_counts),
        )
