/*
 Copyright 2012-2015, Yahoo Inc.
 Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
 */
'use strict';

function TeamcityReport(opts) {
    opts = opts || {};
    this.file = opts.file || null;
    this.blockName = opts.blockName || 'Code Coverage Summary';
}

function lineForKey(value, teamcityVar) {
    return (
        "##teamcity[buildStatisticValue key='" +
        teamcityVar +
        "' value='" +
        value +
        "']"
    );
}

TeamcityReport.prototype.onStart = function(node, context) {
    const metrics = node.getCoverageSummary();
    const cw = context.writer.writeFile(this.file);

    cw.println('');
    cw.println("##teamcity[blockOpened name='" + this.blockName + "']");

    //Statements Covered
    cw.println(
        lineForKey(metrics.statements.covered, 'CodeCoverageAbsBCovered')
    );
    cw.println(lineForKey(metrics.statements.total, 'CodeCoverageAbsBTotal'));

    //Branches Covered
    cw.println(lineForKey(metrics.branches.covered, 'CodeCoverageAbsRCovered'));
    cw.println(lineForKey(metrics.branches.total, 'CodeCoverageAbsRTotal'));

    //Functions Covered
    cw.println(
        lineForKey(metrics.functions.covered, 'CodeCoverageAbsMCovered')
    );
    cw.println(lineForKey(metrics.functions.total, 'CodeCoverageAbsMTotal'));

    //Lines Covered
    cw.println(lineForKey(metrics.lines.covered, 'CodeCoverageAbsLCovered'));
    cw.println(lineForKey(metrics.lines.total, 'CodeCoverageAbsLTotal'));

    cw.println("##teamcity[blockClosed name='" + this.blockName + "']");
    cw.close();
};

module.exports = TeamcityReport;
