import { mainPage } from "../../support/page_objects/mainPage";
import { projectsPage } from "../../support/page_objects/navigation";
import { loginPage } from "../../support/page_objects/navigation";
import { isTestSuiteActive } from "../../support/page_objects/projectConstants";
import {
  _advSettings,
  _editSchema,
  _editData,
  _editComment,
  _viewMenu,
  _topRightMenu,
} from "../spec/roleValidation.spec";

let linkText = "";

export const genTest = (type, xcdb) => {
  if (!isTestSuiteActive(type, xcdb)) return;

  const permissionValidation = (roleType) => {
    it(`${roleType}: Visit base shared URL`, () => {
      cy.log(linkText);

      // visit URL & wait for page load to complete
      cy.visit(linkText, {
        baseUrl: null,
      });
      projectsPage.waitHomePageLoad();

      cy.closeTableTab("Actor");
    });

    it(`${roleType}: Validate access permissions: advance menu`, () => {
      _advSettings(roleType, false);
    });

    it(`${roleType}: Validate access permissions: edit schema`, () => {
      _editSchema(roleType, false);
    });

    it(`${roleType}: Validate access permissions: edit data`, () => {
      _editData(roleType, false);
    });

    it(`${roleType}: Validate access permissions: edit comments`, () => {
      _editComment(roleType, false);
    });

    it(`${roleType}: Validate access permissions: view's menu`, () => {
      _viewMenu(roleType, false);
    });
  };

  describe(`${type.toUpperCase()} Base VIEW share`, () => {
    it(`Generate base share URL`, () => {
      // click SHARE
      cy.get(".nc-topright-menu").find(".nc-menu-share").click();

      // Click on readonly base text
      cy.getActiveModal().find(".nc-disable-shared-base").click();

      // Select 'Readonly link'
      cy.getActiveMenu()
        .find(".caption")
        .contains("Anyone with the link")
        .click();

      // Copy URL
      cy.getActiveModal()
        .find(".nc-url")
        .then(($obj) => {
          cy.log($obj[0]);
          linkText = $obj[0].innerText.trim();

          const htmlFile = `
<!DOCTYPE html>
<html>
<body>

<iframe
class="nc-embed"
src="${linkText}?embed"
frameborder="0"
width="100%"
height="700"
style="background: transparent; "></iframe>

</body>
</html>
            `;
          cy.writeFile(
            "scripts/cypress/fixtures/sampleFiles/iFrame.html",
            htmlFile
          );
        });
    });

    permissionValidation("viewer");

    it("Update to EDITOR base share link", () => {
      loginPage.loginAndOpenProject(type, xcdb);

      // click SHARE
      cy.get(".nc-topright-menu").find(".nc-menu-share").click();

      cy.getActiveModal().find(".nc-shared-base-role").click();

      cy.getActiveMenu().find('[role="menuitem"]').contains("Editor").click();
    });

    permissionValidation("editor");

    it("Generate & verify embed HTML IFrame", { baseUrl: null }, () => {
      // open iFrame html
      cy.visit("scripts/cypress/fixtures/sampleFiles/iFrame.html");

      // wait for iFrame to load
      cy.frameLoaded(".nc-embed");

      // for GQL- additionally close GQL Client window
      if (type === "graphql") {
        cy.iframe().find(`[title="Graphql Client"] > button.mdi-close`).click();
      }

      // validation for base menu opitons
      cy.iframe().find(".nc-project-tree").should("exist");
      cy.iframe().find(".nc-fields-menu-btn").should("exist");
      cy.iframe().find(".nc-sort-menu-btn").should("exist");
      cy.iframe().find(".nc-filter-menu-btn").should("exist");
      cy.iframe().find(".nc-actions-menu-btn").should("exist");

      // validate data (row-1)
      mainPage
        .getIFrameCell("FirstName", 1)
        .contains("PENELOPE")
        .should("exist");
      mainPage.getIFrameCell("LastName", 1).contains("GUINESS").should("exist");
    });
  });
};

/**
 * @copyright Copyright (c) 2021, Xgene Cloud Ltd
 *
 * @author Raju Udava <sivadstala@gmail.com>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */
