# 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 mozautolog import RESTfulAutologTestGroup

from base import Output, count, long_name


class AutologOutput(Output):

    def __init__(self, es_server='buildbot-es.metrics.scl3.mozilla.com:9200',
                 rest_server='http://brasstacks.mozilla.com/autologserver',
                 name='moztest',
                 harness='moztest'):
        self.es_server = es_server
        self.rest_server = rest_server

    def serialize(self, results_collection, file_obj):
        grps = self.make_testgroups(results_collection)
        for g in grps:
            file_obj.write(g.serialize())

    def make_testgroups(self, results_collection):
        testgroups = []
        for context in results_collection.contexts:
            coll = results_collection.subset(lambda t: t.context == context)
            passed = coll.tests_with_result('PASS')
            failed = coll.tests_with_result('UNEXPECTED-FAIL')
            unexpected_passes = coll.tests_with_result('UNEXPECTED-PASS')
            errors = coll.tests_with_result('ERROR')
            skipped = coll.tests_with_result('SKIPPED')
            known_fails = coll.tests_with_result('KNOWN-FAIL')

            testgroup = RESTfulAutologTestGroup(
                 testgroup=context.testgroup,
                 os=context.os,
                 platform=context.arch,
                 harness=context.harness,
                 server=self.es_server,
                 restserver=self.rest_server,
                 machine=context.hostname,
                 logfile=context.logfile,
                )
            testgroup.add_test_suite(
                testsuite=results_collection.suite_name,
                elapsedtime=coll.time_taken,
                passed=count(passed),
                failed=count(failed) + count(errors) + count(unexpected_passes),
                todo=count(skipped) + count(known_fails),
                )
            testgroup.set_primary_product(
                tree=context.tree,
                revision=context.revision,
                productname=context.product,
                buildtype=context.buildtype,
                )
            # need to call this again since we already used the generator
            for f in coll.tests_with_result('UNEXPECTED-FAIL'):
                testgroup.add_test_failure(
                    test=long_name(f),
                    text='\n'.join(f.output),
                    status=f.result,
                    )
            testgroups.append(testgroup)
        return testgroups

    def post(self, data):
        msg = "Must pass in a list returned by make_testgroups."
        for d in data:
            assert isinstance(d, RESTfulAutologTestGroup), msg
            d.submit()
