// Copyright 2017 The Nomulus Authors. All Rights Reserved.
//
// 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.

goog.provide('registry.registrar.AdminSettings');

goog.forwardDeclare('registry.registrar.Console');
goog.require('goog.array');
goog.require('goog.dom');
goog.require('goog.dom.classlist');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.json');
goog.require('goog.net.XhrIo');
goog.require('goog.soy');
goog.require('registry.Resource');
goog.require('registry.ResourceComponent');
goog.require('registry.soy.registrar.admin');



/**
 * Admin Settings page, such as allowed TLDs for this registrar.
 * @param {!registry.registrar.Console} console
 * @param {!registry.Resource} resource the RESTful resource for the registrar.
 * @constructor
 * @extends {registry.ResourceComponent}
 * @final
 */
registry.registrar.AdminSettings = function(console, resource) {
  registry.registrar.AdminSettings.base(
      this, 'constructor', console, resource,
      registry.soy.registrar.admin.settings, console.params.isAdmin, null);
};
goog.inherits(registry.registrar.AdminSettings, registry.ResourceComponent);


/** @override */
registry.registrar.AdminSettings.prototype.bindToDom = function(id) {
  registry.registrar.AdminSettings.base(this, 'bindToDom', 'fake');
  goog.dom.removeNode(goog.dom.getRequiredElement('reg-app-btn-back'));
};

/** @override */
registry.registrar.AdminSettings.prototype.runAfterRender = function(objArgs) {
  const oteButton = goog.dom.getElement('btn-ote-status');
  if (oteButton) {
    goog.events.listen(
        oteButton,
        goog.events.EventType.CLICK,
        goog.bind(
            this.oteStatusCheck_, this, objArgs.xsrfToken, objArgs.clientId),
        false, this);
  }
};

/** @override */
registry.registrar.AdminSettings.prototype.setupEditor = function(objArgs) {
  goog.dom.classlist.add(
      goog.dom.getRequiredElement('tlds'), goog.getCssName('editing'));
  var tlds = goog.dom.getElementsByClass(
      goog.getCssName('tld'), goog.dom.getRequiredElement('tlds'));
  goog.array.forEach(tlds, function(tld) {
    var remBtn = goog.dom.getChildren(tld)[0];
    goog.events.listen(
        remBtn, goog.events.EventType.CLICK,
        goog.bind(this.onTldRemove_, this, remBtn));
  }, this);
  this.typeCounts['reg-tlds'] =
      objArgs.allowedTlds ? objArgs.allowedTlds.length : 0;

  goog.events.listen(
      goog.dom.getRequiredElement('btn-add-tld'), goog.events.EventType.CLICK,
      this.onTldAdd_, false, this);
};

/**
 * JSON response prefix which prevents evaluation.
 * @private {string}
 * @const
 */
registry.registrar.AdminSettings.PARSER_BREAKER_ = ')]}\'\n';

/**
 * Click handler for OT&E status checking button.
 * @param {string} xsrfToken
 * @param {string} clientId
 * @private
 */
registry.registrar.AdminSettings.prototype.oteStatusCheck_ = function(
    xsrfToken, clientId) {
  goog.net.XhrIo.send('/registrar-ote-status', function(e) {
    var response =
        /** @type {!registry.json.ote.OteStatusResponse} */
        (e.target.getResponseJson(
            registry.registrar.AdminSettings.PARSER_BREAKER_));
    var oteResultParent = goog.dom.getRequiredElement('ote-status-area-parent');
    if (response.status === 'SUCCESS') {
      var results = response.results[0];
      goog.soy.renderElement(
          oteResultParent, registry.soy.registrar.admin.oteResultsTable,
          {completed: results.completed, detailsList: results.details});
    } else {
      goog.soy.renderElement(
          oteResultParent, registry.soy.registrar.admin.oteErrorArea,
          {message: response.message});
    }
  }, 'POST', goog.json.serialize({'clientId': clientId}), {
    'X-CSRF-Token': xsrfToken,
    'Content-Type': 'application/json; charset=UTF-8'
  });
};

/**
 * Click handler for TLD add button.
 * @private
 */
registry.registrar.AdminSettings.prototype.onTldAdd_ = function() {
  const tldInputElt = goog.dom.getRequiredElement('newTld');
  const tldElt = goog.soy.renderAsFragment(registry.soy.registrar.admin.tld, {
    name: 'allowedTlds[' + this.typeCounts['reg-tlds'] + ']',
    tld: tldInputElt.value,
  });
  goog.dom.appendChild(goog.dom.getRequiredElement('tlds'), tldElt);
  var remBtn = goog.dom.getFirstElementChild(tldElt);
  goog.dom.classlist.remove(remBtn, goog.getCssName('hidden'));
  goog.events.listen(
      remBtn, goog.events.EventType.CLICK,
      goog.bind(this.onTldRemove_, this, remBtn));
  this.typeCounts['reg-tlds']++;
  tldInputElt.value = '';
};


/**
 * Click handler for TLD remove button.
 * @param {!Element} remBtn The remove button.
 * @private
 */
registry.registrar.AdminSettings.prototype.onTldRemove_ = function(remBtn) {
  goog.dom.removeNode(goog.dom.getParentElement(remBtn));
};
