<!DOCTYPE html>
<!--
Copyright (c) 2016 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.
-->

<link rel="import" href="/tracing/ui/base/checkbox.html">
<link rel="import" href="/tracing/ui/base/ui.html">

<polymer-element name='tr-ui-b-checkbox-picker'>
  <template>
    <style>
    #container {
      display: flex;
      flex-direction: column;
    }
    </style>

    <div id="container">
    </div>

  </template>

  <script>
  'use strict';

  Polymer({
    created: function() {
      this.needsInit_ = true;
      this.settingsKey_ = undefined;
      this.is_ready_ = false;
      this.checkboxes_ = undefined;
    },

    ready: function() {
      this.is_ready_ = true;
      this.maybeInit_();
      this.maybeRenderCheckboxes_();
    },

    get settingsKey() {
      return this.settingsKey_;
    },

    set settingsKey(settingsKey) {
      if (!this.needsInit_)
        throw new Error('Already initialized.');
      this.settingsKey_ = settingsKey;
      this.maybeInit_();
    },

    maybeInit_: function() {
      if (!this.needsInit_)
        return;
      if (this.settingsKey_ === undefined)
        return;
      if (this.checkboxes_ === undefined)
        return;

      this.needsInit_ = false;

      for (var key in this.checkboxes_) {
        this.checkboxes_[key].defaultCheckedValue = false;
        this.checkboxes_[key].settingsKey = this.settingsKey_ + key;
      }
    },

    set items(items) {
      this.checkboxes_ = {};
      items.forEach(function(e) {
        if (e.key in this.checkboxes_)
          throw new Error(e.key + ' already exists');
        var checkboxEl = document.createElement('tr-ui-b-checkbox');
        checkboxEl.label = e.label;
        this.checkboxes_[e.key] = checkboxEl;
      }.bind(this));
      this.maybeInit_();
      this.maybeRenderCheckboxes_();
    },

    maybeRenderCheckboxes_: function() {
      if (!this.is_ready_)
        return;
      if (this.checkboxes_ === undefined)
        return;
      for (var key in this.checkboxes_)
        this.$.container.appendChild(this.checkboxes_[key]);
    },

    selectCheckbox: function(key) {
        if (!(key in this.checkboxes_))
          throw new Error(key + ' does not exists');
        this.checkboxes_[key].checked = true;
    },

    unselectCheckbox: function(key) {
        if (!(key in this.checkboxes_))
          throw new Error(key + ' does not exists');
        this.checkboxes_[key].checked = false;
    },

    get checkedKeys() {
      return Object.keys(this.checkboxes_).filter(function(k) {
        return this.checkboxes_[k].checked;
      }.bind(this));
    },

  });
  </script>
</polymer-element>
