// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @typedef {{
 *   id: string,
 *   name: string,
 *   subnodes: Array<{id: string, name: string, readonly: boolean,
 *                     untrusted: boolean, extractable: boolean,
 *                     policy: boolean}>
 * }}
 */
var CertificateData;

cr.define('options', function() {
  /** @const */ var Tree = cr.ui.Tree;
  /** @const */ var TreeItem = cr.ui.TreeItem;

  /**
   * Creates a new tree folder for certificate data.
   * @param {Object=} data Data used to create a certificate tree folder.
   * @constructor
   * @extends {TreeItem}
   */
  function CertificateTreeFolder(data) {
    data.isCert = false;
    var treeFolder = new TreeItem({
      label: data.name,
      data: data
    });
    treeFolder.__proto__ = CertificateTreeFolder.prototype;

    if (data.icon)
      treeFolder.icon = data.icon;

    return treeFolder;
  }

  CertificateTreeFolder.prototype = {
    __proto__: TreeItem.prototype,

    /**
     * The tree path id/.
     * @type {string}
     */
    get pathId() {
      return this.data.id;
    }
  };

  /**
   * Creates a new tree item for certificate data.
   * @param {Object=} data Data used to create a certificate tree item.
   * @constructor
   * @extends {TreeItem}
   */
  function CertificateTreeItem(data) {
    data.isCert = true;
    // TODO(mattm): other columns
    var treeItem = new TreeItem({
      label: data.name,
      data: data
    });
    treeItem.__proto__ = CertificateTreeItem.prototype;

    if (data.icon)
      treeItem.icon = data.icon;

    if (data.untrusted) {
      var badge = document.createElement('span');
      badge.classList.add('cert-untrusted');
      badge.textContent = loadTimeData.getString('badgeCertUntrusted');
      treeItem.labelElement.insertBefore(
          badge, treeItem.labelElement.firstChild);
    }

    if (data.policy) {
      var policyIndicator = new options.ControlledSettingIndicator();
      policyIndicator.controlledBy = 'policy';
      policyIndicator.setAttribute(
          'textpolicy', loadTimeData.getString('certPolicyInstalled'));
      policyIndicator.classList.add('cert-policy');
      treeItem.labelElement.appendChild(policyIndicator);
    }

    return treeItem;
  }

  CertificateTreeItem.prototype = {
    __proto__: TreeItem.prototype,

    /**
     * The tree path id/.
     * @type {string}
     */
    get pathId() {
      return this.parentItem.pathId + ',' + this.data.id;
    }
  };

  /**
   * Creates a new cookies tree.
   * @param {Object=} opt_propertyBag Optional properties.
   * @constructor
   * @extends {Tree}
   */
  var CertificatesTree = cr.ui.define('tree');

  CertificatesTree.prototype = {
    __proto__: Tree.prototype,

    /** @override */
    decorate: function() {
      Tree.prototype.decorate.call(this);
      this.treeLookup_ = {};
    },

    /** @override */
    addAt: function(child, index) {
      Tree.prototype.addAt.call(this, child, index);
      if (child.data && child.data.id)
        this.treeLookup_[child.data.id] = child;
    },

    /**
     * @param {!cr.ui.TreeItem=} child
     * @override
     */
    remove: function(child) {
      Tree.prototype.remove.call(this, child);
      if (child.data && child.data.id)
        delete this.treeLookup_[child.data.id];
    },

    /**
     * Clears the tree.
     */
    clear: function() {
      // Remove all fields without recreating the object since other code
      // references it.
      for (var id in this.treeLookup_)
        delete this.treeLookup_[id];
      this.textContent = '';
    },

    /**
     * Populate the tree.
     * @param {Array<CertificateData>} nodesData Nodes data array.
     */
    populate: function(nodesData) {
      this.clear();

      for (var i = 0; i < nodesData.length; ++i) {
        var subnodes = nodesData[i].subnodes;
        delete nodesData[i].subnodes;

        var item = new CertificateTreeFolder(nodesData[i]);
        this.addAt(item, i);

        for (var j = 0; j < subnodes.length; ++j) {
          var subitem = new CertificateTreeItem(subnodes[j]);
          item.addAt(subitem, j);
        }
        // Make tree expanded by default.
        item.expanded = true;
      }

      cr.dispatchSimpleEvent(this, 'change');
    },
  };

  return {
    CertificatesTree: CertificatesTree
  };
});

