// 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.

Gerrit.install(function(self) {

  if (window.Polymer) { return; }

  // The code below is only used by the GWT-UI

  function toUpperCamel(str) {
    var words = str.split('_');
    for (i=0; i<words.length; i++) {
      words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
    }
    return words.join(' ');
  }

  function createRow(doc, name, value) {
    var tr = doc.createElement('tr');
    var td = doc.createElement('td');
    td.appendChild(doc.createTextNode(toUpperCamel(name) + ':'));
    tr.appendChild(td);
    td = doc.createElement('td');
    td.appendChild(doc.createTextNode(value));
    tr.appendChild(td);
    return tr;
  }

  function onProjectInfo(panel) {
    var url = 'projects/'
      + encodeURI(panel.p.PROJECT_NAME).replace(/\//g, '%2F') //escape slashes
      + '/' + this.pluginName + '~'
      + 'lfs:config-project';

    Gerrit.get(url, function(lfs) {
      // Don't show LFS header if nothing is configured
      if (Object.getOwnPropertyNames(lfs).length < 1) {
        return;
      }

      var doc = document;
      // create header
      var td = doc.createElement('td');
      td.appendChild(Gerrit.html(
        '<div class=\"smallHeading\">LFS Options</div>'));
      var tr = doc.createElement('tr');
      tr.appendChild(td);
      var table = doc.createElement('table');
      table.appendChild(tr);

      // add all properties
      for (var name in lfs) {
        table.appendChild(createRow(doc, name, lfs[name]));
      }

      var frg = doc.createDocumentFragment();
      frg.appendChild(table);
      panel.body.appendChild(frg);
    });
  }

  self.panel('PROJECT_INFO_SCREEN_BOTTOM', onProjectInfo);
  });
