import filterTests from "../support/filterTests"
const interact = require('../support/interact')

filterTests(["smoke", "all"], () => {
  context("Create a Table", () => {
    before(() => {
      cy.login()
      cy.createTestApp()
    })

    it("should create a new Table", () => {
      cy.createTable("dog")
      // Check if Table exists
      cy.get(interact.TABLE_TITLE_H1, { timeout: 1000 }).should("have.text", "dog")
    })

    it("adds a new column to the table", () => {
      cy.addColumn("dog", "name", "Text")
      cy.contains("name").should("be.visible")
    })

    it("creates a row in the table", () => {
      cy.addRow(["Rover"])
      cy.contains("Rover").should("be.visible")
    })

    it("updates a column on the table", () => {
      cy.get(interact.TABLE_TITLE).click()
      cy.get(interact.SPECTRUM_TABLE_EDIT).click()
      cy.get(interact.MODAL_INNER_WRAPPER).within(() => {

      cy.get("input").eq(0).type("updated", { force: true })
      // Unset table display column
      cy.get(interact.SPECTRUM_SWITCH_INPUT).eq(1).click()
      cy.contains("Save Column").click()
      })
      cy.contains("nameupdated ").should("contain", "nameupdated")
    })

    it("edits a row", () => {
      cy.contains("button", "Edit").click({ force: true })
      cy.wait(500)
      cy.get(interact.SPECTRUM_MODAL_INPUT).clear()
      cy.get(interact.SPECTRUM_MODAL_INPUT).type("Updated")
      cy.contains("Save").click()
      cy.contains("Updated").should("have.text", "Updated")
    })

    it("deletes a row", () => {
      cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true })
      cy.contains("Delete 1 row(s)").click()
      cy.get(interact.SPECTRUM_MODAL).contains("Delete").click()
      cy.contains("RoverUpdated").should("not.exist")
    })

    if (Cypress.env("TEST_ENV")) {
      // No Pagination in CI - Test env only for the next two tests
      xit("Adds 15 rows and checks pagination", () => {
        // 10 rows per page, 15 rows should create 2 pages within table
        const totalRows = 16
        for (let i = 1; i < totalRows; i++) {
          cy.addRow([i])
        }
        cy.reload()
        cy.get(interact.SPECTRUM_PAGINATION, { timeout: 2000 }).within(() => {
          cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).click()
        })
        cy.get(interact.SPECTRUM_PAGINATION).within(() => {
          cy.get(interact.SPECTRUM_BODY_SECOND).contains("Page 2")
        })
      })

      xit("Deletes rows and checks pagination", () => {
        // Delete rows, removing second page from table
        cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true })
        cy.get(interact.POPOVERS).within(() => {
          cy.get(interact.SPECTRUM_BUTTON).click({ force: true })
        })
        cy.get(interact.SPECTRUM_DIALOG_GRID).contains("Delete").click({ force: true })

        // Confirm table only has one page
        cy.get(interact.SPECTRUM_PAGINATION, { timeout: 1000 }).within(() => {
          cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).should("not.be.enabled")
        })
      })
    }

    it("deletes a column", () => {
      const columnName = "nameupdated"
      cy.get(interact.TABLE_TITLE).click()
      cy.get(interact.SPECTRUM_TABLE_EDIT).click()
      cy.contains("Delete").click()
      cy.get(interact.DELETE_COLUMN_CONFIRM).type(columnName)
      cy.contains("Delete Column").click()
      cy.contains("nameupdated").should("not.exist")
    })

    it("deletes a table", () => {
      cy.get(interact.NAV_ITEM)
        .contains("dog")
        .parents(interact.NAV_ITEM)
        .first()
        .within(() => {
          cy.get(interact.ACTION_SPECTRUM_ICON).click({ force: true })
        })
      cy.get(interact.SPECTRUM_MENU_CHILD2).click()
      cy.get(interact.DELETE_TABLE_CONFIRM).type("dog")
      cy.contains("Delete Table").click()
      cy.contains("dog").should("not.exist")
    })
  })
})