import { mainPage, settingsPage } from "../../support/page_objects/mainPage";
import { roles } from "../../support/page_objects/projectConstants";

// Left hand navigation bar, validation for
//  1. Audit menu
//  2. Advance settings menu
//  3. Preview mode menu
//
export function _advSettings(roleType, mode) {
    cy.log(roleType, mode);

    if(mode === 'baseShare') {

        // open modal
        cy.get('.nc-project-menu').should('exist').click()
        cy.getActiveMenu().find(`[data-menu-id="language"]`).should('exist')

        // click again to close modal
        cy.get('.nc-project-menu').should('exist').click()
        return;
    }

    let validationString =
        true == roles[roleType].validations.advSettings ? "exist" : "not.exist";

    // cy.get(".nc-team-settings").should(validationString);
    cy.get('.nc-project-menu').should('exist').click()
    cy.getActiveMenu().find(`[data-menu-id="preview-as"]`).should(validationString)
    cy.getActiveMenu().find(`[data-menu-id="teamAndSettings"]:visible`).should(validationString)

    if (true === roles[roleType].validations.advSettings) {
        cy.getActiveMenu().find(`[data-menu-id="teamAndSettings"]:visible`).should(validationString).click()

        cy.get(`[data-menu-id="teamAndAuth"]`).should('exist')
        cy.get(`[data-menu-id="appStore"]`).should('exist')
        cy.get(`[data-menu-id="metaData"]`).should('exist')
        cy.get(`[data-menu-id="audit"]`).should('exist')

        settingsPage.closeMenu()
    } else {
        cy.get('.nc-project-menu').should('exist').click()
    }

    // float menu in preview mode
    if ("preview" === mode) {
        cy.get(".nc-floating-preview-btn").should("exist");
        cy.get('.nc-floating-preview-btn')
            .find(`[type="radio"][value="${roles[roleType].name}"]`)
            .should("be.checked");
    }

    // cy.get("body").click("bottomRight");
}

export function _editSchema(roleType, mode) {
    let columnName = "City";
    let validationString =
        true === roles[roleType].validations.editSchema ? "exist" : "not.exist";

    cy.openTableTab(columnName, 25);

    // create table
    cy.get(`.nc-add-new-table`).should(validationString);

    // delete table option
    cy.get(`.nc-project-tree-tbl-City`).should("exist").rightclick();
    cy.get(".ant-dropdown-content:visible").should(validationString);

    if(validationString === "exist"){
        cy.getActiveMenu().find('[role="menuitem"]').contains("Delete").should("exist");
        cy.getActiveMenu().find('[role="menuitem"]').contains("Rename").should("exist");

        // click on a cell to close table context menu
        mainPage.getCell(columnName, 3).click();
    }

    // add new column option
    //
    cy.get(".nc-column-add").should(validationString);

    // update column (edit/ delete menu)
    cy.get('.nc-ui-dt-dropdown').should(validationString)

    if(validationString === "exist"){
        cy.get('.nc-import-menu').should('exist').click();
        cy.getActiveMenu().should('exist')
        cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('Airtable')
        cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('CSV file')
        cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('JSON file')
        cy.getActiveMenu().find('.ant-dropdown-menu-item').contains('Microsoft Excel')
    }
}

export function _editData(roleType, mode) {
    let columnName = "City";
    let validationString =
        true === roles[roleType].validations.editData ? "exist" : "not.exist";

    cy.openTableTab(columnName, 25);

    // add row button
    cy.get('.nc-add-new-row-btn:visible').should(validationString);

    // add button at bottom of page
    mainPage.getCell(columnName, 25).scrollIntoView();
    cy.get('.nc-grid-add-new-cell:visible').should(validationString);

    // update row option (right click)
    //
    mainPage.getCell("City", 5).rightclick();
    cy.wait(100);
    cy.get(".ant-dropdown-content:visible").should(validationString);

    if (validationString === "exist") {
        // right click options will exist (only for 'exist' case)
        //
        cy.getActiveMenu().contains("Insert New Row").should(validationString);
        cy.getActiveMenu().contains("Clear cell").should(validationString);
        cy.getActiveMenu().contains("Delete Row").should(validationString);
        cy.getActiveMenu().contains("Delete Selected Rows").should(validationString);

        // cy.get("body").type("{esc}");
        mainPage.getCell("City", 13).click();

        // update cell contents option using row expander should be enabled
        //
        mainPage
          .getRow(1)
          .find('.nc-row-no').should('exist')
          .eq(0)
          .trigger('mouseover', { force: true })
        cy.get(".nc-row-expand")
          .should("exist")
          .eq(10)
          .click({ force: true });
        cy.getActiveDrawer().find("button").contains("Save row").should("exist");
        cy.getActiveDrawer().find("button").contains("Cancel").should("exist").click();
    } else {
        // update cell contents option using row expander should be disabled
        //
        cy.get(".nc-row-expand")
          .should("exist")
          .eq(10)
          .click({ force: true });
        cy.getActiveDrawer().find("button:disabled").contains("Save row").should("exist");
        cy.getActiveDrawer().find("button").contains("Cancel").should("exist").click();
    }

    // double click cell entries to edit
    //
    mainPage.getCell("City", 5)
        .dblclick()
        .find("input")
        .should(validationString);
}

// read &/ update comment
//      Viewer: only allowed to read
//      Everyone else: read &/ update
//
export function _editComment(roleType, mode) {
    let columnName = "City";
    let validationString =
        true === roles[roleType].validations.editComment
            ? "Comment added successfully"
            : "Not allowed";

    cy.openTableTab(columnName, 25);

    cy.wait(1000);

    // click on comment icon & type comment
    //
    cy.get(".nc-row-expand")
      .should("exist")
      .eq(10)
      .click({force:true});

    // Expected response:
    //      Viewer: Not able to see comment option
    //      Everyone else: Comment added/read successfully
    //

    cy.wait(3000);

    if ("viewer" === roleType) {
        cy.getActiveDrawer()
            .should('exist')
            .find(".nc-toggle-comments")
            .should("not.exist");
    } else {
        cy.getActiveDrawer()
            .should('exist')
            .find(".nc-toggle-comments")
            .should("exist")
            .click();

        cy.getActiveDrawer().find(".nc-comment-box").should('exist').type("Comment-1{enter}");
        // cy.toastWait('Comment added successfully')
        cy.getActiveDrawer().find(".nc-toggle-comments").click();
    }

    cy.getActiveDrawer()
        .find("button")
        .contains("Cancel")
        .should("exist")
        .click();
}

// right navigation menu bar
//      Editor/Viewer/Commenter : can only view 'existing' views
//      Rest: can create/edit
export function _viewMenu(roleType, mode) {
    let columnName = "City";

    // Lock, Download, Upload
    let menuWithSubmenuCount = 3;

    // share view list, webhook
    let menuWithoutSubmenuCount = 3;

    cy.openTableTab(columnName, 25);

    cy.get('.nc-toggle-right-navbar').click();
    cy.wait(1000);

    // hard-wire
    // window.localStorage.setItem('nc-right-sidebar', '{"isOpen":true,"hasSidebar":true}')


    let validationString =
        true === roles[roleType].validations.shareView ? "exist" : "not.exist";

    if (roleType === "editor") {
        // Download / Upload CSV
        menuWithSubmenuCount = 2;
        // Get API Snippet
        menuWithoutSubmenuCount = 1
        if(mode === 'baseShare') menuWithoutSubmenuCount = 0
    } else if (roleType === "commenter" || roleType === "viewer") {
        // Download CSV & Download excel
        menuWithSubmenuCount = 0;
        menuWithoutSubmenuCount = 2
    }

    // view list field (default GRID view)
    cy.get(`.nc-view-item`).should("exist");

    // view create option, exists only for owner/ creator
    cy.get(`.nc-create-grid-view`).should(validationString);
    cy.get(`.nc-create-gallery-view`).should(validationString);
    cy.get(`.nc-create-form-view`).should(validationString);

    // share view permissions are role specific

    // actions menu (more), only download csv should be visible for non-previlaged users
    cy.get(".nc-actions-menu-btn").click();
    cy.getActiveMenu()
        .find('.ant-dropdown-menu-submenu:visible')
        .should("have.length", menuWithSubmenuCount);
    cy.getActiveMenu()
        .find('.ant-dropdown-menu-item:visible')
        .should("have.length", menuWithoutSubmenuCount);
    // click again to close menu
    cy.get(".nc-actions-menu-btn").click();
}

export function _topRightMenu(roleType, mode) {
    // kludge; download csv menu persists until clicked
    let columnName = "City";
    // cy.closeTableTab(columnName);
    // cy.openTableTab(columnName, 25);

    let validationString =
        true == roles[roleType].validations.shareView ? "exist" : "not.exist";

    cy.get(`.nc-share-base`).should(validationString);
    cy.get(".nc-menu-translate").should("exist");
    cy.get(".nc-menu-accounts").should("exist");
}

// Access control list
//
export function disableTableAccess(tbl, role) {
    const cls = `.nc-acl-${tbl}-${role}-chkbox`;
    cy.get(cls).find("input").should("be.checked").click({ force: true });
    cy.get(cls).find("input").should("not.be.checked");
}

export function enableTableAccess(tbl, role) {
    const cls = `.nc-acl-${tbl}-${role}-chkbox`;
    cy.get(cls).find("input").should("not.be.checked").click({ force: true });
    cy.get(cls).find("input").should("be.checked");
}

export function _accessControl(roleType, previewMode) {
    let validationString = roleType === "creator" ? "exist" : "not.exist";

    cy.get(`.nc-project-tree-tbl-Language`).should(validationString)
    cy.get(`.nc-project-tree-tbl-CustomerList`).should(validationString)
}
