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



var newDatabaseName = 'fauxton-selenium-tests-db-create';
var invalidDatabaseName = 'fauxton-selenium-tests-#####';
var helpers = require('../../../../../test/nightwatch_tests/helpers/helpers.js');
module.exports = {

  before: function (client, done) {
    const nano = helpers.getNanoInstance(client.globals.test_settings.db_url);
    nano.db.destroy(newDatabaseName).then(() => {
      done();
    }).catch(()  => {
      done();
    });
  },

  after: function (client, done) {
    const nano = helpers.getNanoInstance(client.globals.test_settings.db_url);
    nano.db.destroy(newDatabaseName).then(() => {
      done();
    }).catch(()  => {
      console.warn(`Could not delete ${newDatabaseName} db`);
      done();
    });
  },

  'Creates a Database' : function (client) {
    var waitTime = client.globals.maxWaitTime,
        baseUrl = client.globals.test_settings.launch_url;

    client
      .loginToGUI()
      .checkForDatabaseDeleted(newDatabaseName, waitTime)
      .url(baseUrl)

      // ensure the page has fully loaded
      .waitForElementPresent('.databases.table', waitTime, false)
      .clickWhenVisible('.add-new-database-btn')
      .waitForElementVisible('#js-new-database-name', waitTime, false)
      .setValue('#js-new-database-name', [newDatabaseName])
      .clickWhenVisible('#js-create-database', waitTime, false)
      .waitForElementNotPresent('.new-database-tray', waitTime, false)
      .checkForDatabaseCreated(newDatabaseName, waitTime)
      .url(baseUrl + '/_all_dbs')
      .waitForElementVisible('html', waitTime, false)
      .getText('html', function (result) {
        var data = result.value,
            createdDatabaseIsPresent = data.indexOf(newDatabaseName);

        this.verify.ok(createdDatabaseIsPresent > 0,
          'Checking if new database shows up in _all_dbs.');
      })
      .end();
  },

  'Creates a Database with invalid name' : function (client) {
    var waitTime = client.globals.maxWaitTime,
        baseUrl = client.globals.test_settings.launch_url;

    client
      .loginToGUI()
      .checkForDatabaseDeleted(invalidDatabaseName, waitTime)
      .url(baseUrl)

    // ensure the page has fully loaded
      .waitForElementPresent('.databases.table', waitTime, false)
      .clickWhenVisible('.add-new-database-btn')
      .waitForElementVisible('#js-new-database-name', waitTime, false)
      .setValue('#js-new-database-name', [invalidDatabaseName])
      .clickWhenVisible('#js-create-database', waitTime, false)
      .waitForElementVisible('.global-notification.alert.alert-error', waitTime, false)
      .url(baseUrl + '/_all_dbs')
      .waitForElementVisible('html', waitTime, false)
      .getText('html', function (result) {
        var data = result.value,
            createdDatabaseIsPresent = data.indexOf(invalidDatabaseName);

        this.verify.ok(createdDatabaseIsPresent === -1,
          'Checking if new database shows up in _all_dbs.');
      })
      .end();
  }
};
