'use strict';

const CONSTANTS = require('./constants.js');

const common = require('./common.js');
const debug = common.debug;
const getScriptName = common.getScriptName;
const isResourceLink = common.isResourceLink;
const isScript = common.isScript;
const matches = common.matches;

const shouldAdd = options => {
  return options.custom.length > 0;
};

const add = (options, tags) => {
  const update = updateElement.bind(null, options);
  return tags.map(update);
};

const updateElement = (options, tag) => {
  return (isScript(tag) || isResourceLink(tag))
    ? updateScriptElement(options, tag)
    : tag;
};

const updateScriptElement = (options, tag) => {
  const scriptName = getScriptName(options, tag);
  let updated = false;
  options.custom.forEach(customOption => {
    if (matches(scriptName, customOption.test)) {
      tag.attributes = tag.attributes || {};
      tag.attributes[customOption.attribute] = customOption.value;
      updated = true;
    }
  });
  if (updated) {
    debug(`${CONSTANTS.PLUGIN}: updated to: ${JSON.stringify(tag)}`);
  }
  return tag;
};

module.exports = {
  shouldAdd,
  add
};