/*
 * Copyright (c) 2015, Groupon, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * Neither the name of GROUPON nor the names of its contributors may be
 * used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

'use strict';

const debug = require('debug')('nlm:steps:tag-pr');

const Github = require('../github/client');

function nonSemverTag(labelName) {
  return labelName.indexOf('semver-') === -1;
}

function tagPullRequest(cwd, pkg, options) {
  if (!options.pr) {
    debug('Skipping PR tagging, not a PR build');
    return null;
  } else if (!process.env.GH_TOKEN) {
    debug('Skipping PR tagging, no Github token');
    return null;
  }
  const github = Github.forRepository(pkg.repository);
  return github.labels.listByIssue(options.pr).then(labels => {
    const releaseType = options.releaseType;
    const name = `semver-${releaseType}`;
    if (labels.some(l => l.name === name)) {
      debug('Already tagged with %j', name);
      return null;
    }
    const newLabels = labels
      .map(l => l.name)
      .filter(nonSemverTag)
      .concat(name);

    debug('Tagging %s', options.pr, newLabels);
    return github.labels.setForIssue(options.pr, newLabels);
  });
}
module.exports = tagPullRequest;
