import { assert } from 'mocha-webdriver';
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';

describe('Views.ntest', function() {
  test.setupTestSuite(this);

  before(async function() {
    await gu.supportOldTimeyTestCode();
    await gu.actions.createNewDoc();
  });

  afterEach(function() {
    return gu.checkForErrors();
  });

  it('should allow adding and removing viewsections', async function() {
    // Create two new viewsections
    await gu.actions.addNewSection('Table1', 'Table');
    var recordSection = $('.test-gristdoc .view_leaf').eq(0);
    var gridSection = $('.test-gristdoc .view_leaf').eq(1);

    // Check that the newest viewsection has focus
    await assert.hasClass(gridSection, 'active_section');

    await gu.actions.addNewSection('Table1', 'Card');
    var cardSection = $('.test-gristdoc .view_leaf').eq(2);
    assert.lengthOf(await $('.test-gristdoc .view_leaf').array(), 3);

    // Check that the newest viewsection has focus
    await assert.hasClass(cardSection, 'active_section');

    // Click the second viewsection and check that it has focus
    await gridSection.click();
    await assert.hasClass(gridSection, 'active_section');

    // Check that viewsection titles are correct and editable
    var recordTitle = recordSection.find('.test-viewsection-title');
    assert.equal(await recordTitle.text(), 'TABLE1');
    await recordTitle.click();
    await gu.renameActiveSection('foo');
    assert.equal(await recordTitle.text(), 'foo');

    // Delete the first viewsection and check that it`s gone
    await gu.actions.viewSection('foo').selectMenuOption('viewLayout', 'Delete widget');
    await gu.waitForServer();

    assert.lengthOf(await $('.test-gristdoc .view_leaf').array(), 2);
  });

  it('should allow creating a view section for a new table', async function() {
    assert.lengthOf(await $('.test-gristdoc .view_leaf').array(), 2);
    await gu.actions.addNewSection('New', 'Card List');
    var newTitle = $('.test-gristdoc .test-viewsection-title').eq(2).wait();
    assert.equal(await newTitle.text(), 'TABLE2 Card List');
  });

  it('should not create two views when creating a new view for a new table', async function() {
    // This is probably test for a bug. Currently adding new tables to an existing view
    // doesn't produce new views.
    assert.deepEqual(await $(`.test-docpage-label`).array().text(), ['Table1']);
    await gu.actions.addNewView('New', 'Table');
    assert.deepEqual(await $(`.test-docpage-label`).array().text(), ['Table1', 'Table3']);
  });

  it('should switch to a valid default view when the active view is deleted', async function() {
    // This confirms a bug fix where the default view should change when the current
    // default view is deleted
    await gu.actions.selectTabView('Table1');
    assert.equal(await gu.actions.getActiveTab().text(), 'Table1');
    assert.deepEqual(await $(`.test-docpage-label`).array().text(), ['Table1', 'Table3']);
    await gu.actions.tableView('Table1').selectOption('Remove');
    await $(".test-option-page").click();
    await $(".test-modal-confirm").click();
    await gu.waitForServer();
    assert.equal(await gu.actions.getActiveTab().text(), 'Table3');
    assert.deepEqual(await $(`.test-docpage-label`).array().text(), ['Table3']);
  });

  it('should allow adding and removing summary view sections', async function() {
    await gu.removeTable("Table1");
    await gu.actions.addNewTable();
    assert.equal(await gu.actions.getActiveTab().text(), 'Table1');

    await gu.enterGridValues(0, 0, [
      ['a', 'a', 'b'],
      ['c', 'd', 'd'],
      ['1', '2', '3']
    ]);

    await gu.actions.addNewSummarySection('Table1', ['A'], 'Table', 'Section Foo');
    assert.deepEqual(await gu.getGridValues({
      section: 'Section Foo',
      rowNums: [1, 2],
      cols: [0, 1, 2]
    }), ['a', '2', '3', 'b', '1', '3']);

    await gu.actions.viewSection('Section Foo').selectMenuOption('viewLayout', 'Delete widget');
    await gu.waitForServer();

    await gu.actions.addNewSummarySection('Table1', ['B'], 'Table', 'Section Foo');
    assert.deepEqual(await gu.getGridValues({
      section: 'Section Foo',
      rowNums: [1, 2],
      cols: [0, 1, 2]
    }), ['c', '1', '1', 'd', '2', '5']);
  });

  it('should switch to a valid default section when the active section is deleted', async function() {
    // This confirms a bug fix where the section should change when the active section is
    // deleted, either directly or via the section's table being deleted.
    // Reference: https://phab.getgrist.com/T327
    await gu.actions.addNewSection('New', 'Table');
    await gu.waitForServer();
    await gu.getSection('TABLE4').click();
    // Delete the section
    await gu.actions.viewSection('TABLE4').selectMenuOption('viewLayout', 'Delete widget');
    await gu.waitForServer();
    // Assert that the default section (Table1 record) is now active.
    assert.equal(await $('.active_section > .viewsection_title').text(), 'TABLE1');
    // Assert that focus is returned to the deleted section on undo.
    await gu.undo();
    assert.equal(await $('.active_section > .viewsection_title').text(), 'TABLE4');
    // Add a sorted column to the new table. The reported bug shows a symptom of the problem is
    // errors thrown when a sorted column exists in the deleted table.
    await gu.clickCellRC(0, 0);
    await gu.sendKeys('b', $.ENTER);
    await gu.waitForServer();
    await gu.sendKeys('a', $.ENTER);
    await gu.waitForServer();
    await gu.sendKeys('c', $.ENTER);
    await gu.waitForServer();
    await gu.openColumnMenu('A');
    await $(`.grist-floating-menu .test-sort-asc`).click();
    // Delete the table.
    await gu.sendActions([['RemoveTable', 'Table4']]);
    await gu.actions.selectTabView('Table1');
    // Assert that the default section (Table1 record) is now active.
    assert.equal(await $('.active_section > .viewsection_title').text(), 'TABLE1');
    // Again, assert that focus is returned to the deleted section on undo.
    await gu.undo();
    assert.equal(await $('.active_section > .viewsection_title').text(), 'TABLE4');
  });
});