var assert = require('assert');
var fs     = require("fs");
var wd     = require("../../wd-helper");
var config = require("../../config/specs");
var helper = require("../helper");


function closeModal(wdKey) {
  const selector = wd.$(wdKey);

  browser.waitUntil(function() {
    const elem = $(selector);
    return elem.isDisplayedInViewport();
  });

  const closeBtnSelector = $(wd.$(wdKey+".close-modal"));
  closeBtnSelector.click();

  browser.waitUntil(function() {
    return browser.execute((selector) => {
      return !document.querySelector(selector);
    }, selector);
  });
}

describe("modals", function() {
  describe("open", function() {
    var styleFilePath = __dirname+"/../../example-style.json";
    var styleFileData = JSON.parse(fs.readFileSync(styleFilePath));

    beforeEach(function() {
      browser.url(config.baseUrl+"?debug");

      const elem = $(".maputnik-toolbar-link");
      elem.waitForExist();
      browser.flushReactUpdates();

      const elem2 = $(wd.$("nav:open"));
      elem2.click();
      browser.flushReactUpdates();
    });

    it("close", function() {
      closeModal("open-modal");
    });

    // "chooseFile" command currently not available for wdio v5 https://github.com/webdriverio/webdriverio/pull/3632
    it.skip("upload", function() {
      const elem = $("*[type='file']");
      elem.waitForExist();
      browser.chooseFile("*[type='file']", styleFilePath);

      var styleObj = helper.getStyleStore(browser);
      assert.deepEqual(styleFileData, styleObj);
    });

    it("load from url", function() {
      var styleFileUrl  = helper.getGeoServerUrl("example-style.json");

      browser.setValueSafe(wd.$("open-modal.url.input"), styleFileUrl);

      const selector = $(wd.$("open-modal.url.button"));
      selector.click();

      // Allow the network request to happen
      // NOTE: Its localhost so this should be fast.
      browser.pause(300);

      var styleObj = helper.getStyleStore(browser);
      assert.deepEqual(styleFileData, styleObj);
    });

    // TODO: Need to work out how to mock out the end points
    it("gallery")
  })

  describe("export", function() {

    beforeEach(function() {
      browser.url(config.baseUrl+"?debug");

      const elem = $(".maputnik-toolbar-link");
      elem.waitForExist();
      browser.flushReactUpdates();

      const elem2 = $(wd.$("nav:export"));
      elem2.click();
      browser.flushReactUpdates();
    });

    it("close", function() {
      closeModal("export-modal");
    });

    // TODO: Work out how to download a file and check the contents
    it("download")

    // TODO: Work out how to mock the end git points
    it("save to gist")
  })

  describe("sources", function() {
    it("active sources")
    it("public source")
    it("add new source")
  })

  describe("inspect", function() {
    it("toggle", function() {
      browser.url(config.baseUrl+"?debug&style="+helper.getStyleUrl([
        "geojson:example"
      ]));
      browser.acceptAlert();

      const selectBox = $(wd.$("nav:inspect", "select"));
      selectBox.selectByAttribute('value', "inspect");
    })
  })

  describe("style settings", function() {
    beforeEach(function() {
      browser.url(config.baseUrl+"?debug");

      const elem = $(".maputnik-toolbar-link");
      elem.waitForExist();
      browser.flushReactUpdates();

      const elem2 = $(wd.$("nav:settings"));
      elem2.click();
      browser.flushReactUpdates();
    });

    it("name", function() {
      browser.setValueSafe(wd.$("modal-settings.name"), "foobar")
      const elem = $(wd.$("modal-settings.owner"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.name, "foobar");
    })
    it("owner", function() {
      browser.setValueSafe(wd.$("modal-settings.owner"), "foobar")
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.owner, "foobar");
    })
    it("sprite url", function() {
      browser.setValueSafe(wd.$("modal-settings.sprite"), "http://example.com")
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.sprite, "http://example.com");
    })
    it("glyphs url", function() {
      var glyphsUrl = "http://example.com/{fontstack}/{range}.pbf"
      browser.setValueSafe(wd.$("modal-settings.glyphs"), glyphsUrl)
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.glyphs, glyphsUrl);
    })

    it("mapbox access token", function() {
      var apiKey = "testing123";
      browser.setValueSafe(wd.$("modal-settings.maputnik:mapbox_access_token"), apiKey);
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      browser.waitUntil(function() {
        return styleObj.metadata["maputnik:mapbox_access_token"] == apiKey;
      })
    })

    it("maptiler access token", function() {
      var apiKey = "testing123";
      browser.setValueSafe(wd.$("modal-settings.maputnik:openmaptiles_access_token"), apiKey);
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.metadata["maputnik:openmaptiles_access_token"], apiKey);
    })

    it("thunderforest access token", function() {
      var apiKey = "testing123";
      browser.setValueSafe(wd.$("modal-settings.maputnik:thunderforest_access_token"), apiKey);
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.metadata["maputnik:thunderforest_access_token"], apiKey);
    })

    it("style renderer", function() {
      const selector = $(wd.$("modal-settings.maputnik:renderer"));
      selector.selectByAttribute('value', "ol");
      const elem = $(wd.$("modal-settings.name"));
      elem.click();
      browser.flushReactUpdates();

      var styleObj = helper.getStyleStore(browser);
      assert.equal(styleObj.metadata["maputnik:renderer"], "ol");
    })
  })

  describe("sources", function() {
    it("toggle")
  })
})