/**
 * @license
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
(function() {
  'use strict';

  Polymer({
    is: 'gr-linked-text',

    properties: {
      removeZeroWidthSpace: Boolean,
      content: {
        type: String,
        observer: '_contentChanged',
      },
      pre: {
        type: Boolean,
        value: false,
        reflectToAttribute: true,
      },
      disabled: {
        type: Boolean,
        value: false,
        reflectToAttribute: true,
      },
      config: Object,
    },

    observers: [
      '_contentOrConfigChanged(content, config)',
    ],

    _contentChanged(content) {
      // In the case where the config may not be set (perhaps due to the
      // request for it still being in flight), set the content anyway to
      // prevent waiting on the config to display the text.
      if (this.config != null) { return; }
      this.$.output.textContent = content;
    },

    /**
     * Because either the source text or the linkification config has changed,
     * the content should be re-parsed.
     * @param {string|null|undefined} content The raw, un-linkified source
     *     string to parse.
     * @param {Object|null|undefined} config The server config specifying
     *     commentLink patterns
     */
    _contentOrConfigChanged(content, config) {
      var output = Polymer.dom(this.$.output);
      output.textContent = '';
      var parser = new GrLinkTextParser(config,
          this._handleParseResult.bind(this), this.removeZeroWidthSpace);
      parser.parse(content);

      // Ensure that links originating from HTML commentlink configs open in a
      // new tab. @see Issue 5567
      output.querySelectorAll('a').forEach(function(anchor) {
        anchor.setAttribute('target', '_blank');
        anchor.setAttribute('rel', 'noopener');
      });
    },

    /**
     * This method is called when the GrLikTextParser emits a partial result
     * (used as the "callback" parameter). It will be called in either of two
     * ways:
     * - To create a link: when called with `text` and `href` arguments, a link
     *   element should be created and attached to the resulting DOM.
     * - To attach an arbitrary fragment: when called with only the `fragment`
     *   argument, the fragment should be attached to the resulting DOM as is.
     * @param {string|null} text
     * @param {string|null} href
     * @param  {DocumentFragment|undefined} fragment
     */
    _handleParseResult(text, href, fragment) {
      var output = Polymer.dom(this.$.output);
      if (href) {
        var a = document.createElement('a');
        a.href = href;
        a.textContent = text;
        a.target = '_blank';
        a.rel = 'noopener';
        output.appendChild(a);
      } else if (fragment) {
        output.appendChild(fragment);
      }
    },
  });
})();
