import { mainPage } 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, previewMode) {
    cy.log(roleType, previewMode);

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

    cy.get(".nc-team-settings").should(validationString);

    if (true === roles[roleType].validations.advSettings) {
        // audit/advance settings menu visible only for owner/ creator
        mainPage.navigationDraw(mainPage.AUDIT).should(validationString);
        mainPage.closeMetaTab();
        mainPage.navigationDraw(mainPage.APPSTORE).should(validationString);
        mainPage.closeMetaTab();
        mainPage.navigationDraw(mainPage.TEAM_N_AUTH).should(validationString);
        mainPage.closeMetaTab();
        mainPage
            .navigationDraw(mainPage.PROJ_METADATA)
            .should(validationString);
        mainPage.closeMetaTab();
    }

    // option to add new user conditionally visible only to owner/ creator
    cy.get('button:contains("New User")').should(validationString);

    // preview button visibility
    cy.get(".nc-btn-preview:visible").should(validationString);

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

    // if (true == previewMode) {
    //     // preview mode, role toggle menubar is visible
    //     mainPage.navigationDraw(mainPage.ROLE_VIEW_EDITOR).should("exist");
    //     mainPage.navigationDraw(mainPage.ROLE_VIEW_COMMENTER).should("exist");
    //     mainPage.navigationDraw(mainPage.ROLE_VIEW_VIEWER).should("exist");
    //     mainPage.navigationDraw(mainPage.ROLE_VIEW_RESET).should("exist");
    // } else {
    //     // normal mode, role toggle menubar is visible only for owner/ creator
    //     mainPage
    //         .navigationDraw(mainPage.ROLE_VIEW_EDITOR)
    //         .should(validationString);
    //     mainPage
    //         .navigationDraw(mainPage.ROLE_VIEW_COMMENTER)
    //         .should(validationString);
    //     mainPage
    //         .navigationDraw(mainPage.ROLE_VIEW_VIEWER)
    //         .should(validationString);
    // }

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

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

    if (false == previewMode) {
        cy.openTableTab(columnName, 25);
    }

    // create table options
    //
    cy.get(".add-btn").should(validationString);
    cy.get(".v-tabs-bar")
        .eq(0)
        .find(".add-btn.mdi-plus-box")
        .should(validationString);

    // delete table option
    //
    cy.get(".nc-table-delete-btn").should(validationString);

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

    // update column (edit/ delete menu)
    //
    cy.get(`th:contains(${columnName}) .mdi-menu-down`).should(
        validationString
    );
}

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

    cy.openTableTab(columnName, 25);

    // add new row option (from menu header)
    //
    cy.get(".nc-add-new-row-btn").should(validationString);

    // update row option (right click)
    //
    cy.get(`tbody > :nth-child(4) > [data-col="City"]`).rightclick();

    if (previewMode)
        cy.getActiveMenu().contains("Insert New Row").should(validationString);
    else cy.get(".menuable__content__active").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("Delete Row").should(validationString);
        cy.getActiveMenu()
            .contains("Delete Selected Rows")
            .should(validationString);
        cy.get("body").type("{esc}");

        // update cell contents option using row expander should be enabled
        //
        //cy.get('.nc-row-expand-icon').eq(4).click({ force: true })
        cy.get(".v-input.row-checkbox")
            .eq(4)
            .next()
            .next()
            .click({ force: true });
        cy.getActiveModal().find("button").contains("Save row").should("exist");
        cy.get("body").type("{esc}");
    } else {
        // update cell contents option using row expander should be disabled
        //
        //cy.get('.nc-row-expand-icon').eq(4).click({ force: true })
        cy.get(".v-input.row-checkbox")
            .eq(4)
            .next()
            .next()
            .click({ force: true });
        cy.getActiveModal()
            .find("button:disabled")
            .contains("Save row")
            .should("exist");
        cy.getActiveModal().find("button").contains("Cancel").click();
        cy.get("body").type("{esc}");
    }

    // double click cell entries to edit
    //
    cy.get(`tbody > :nth-child(4) > [data-col="City"]`)
        .dblclick()
        .find("input")
        .should(validationString);
}

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

    cy.openTableTab(columnName, 25);

    // click on comment icon & type comment
    //

    cy.get(".v-input.row-checkbox").eq(4).next().next().click({ force: true });

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

    if ("viewer" == roleType) {
        cy.getActiveModal()
            .find(".mdi-comment-multiple-outline")
            .should("not.exist");
    } else {
        cy.getActiveModal()
            .find(".mdi-comment-multiple-outline")
            .should("exist")
            .click();
        cy.getActiveModal().find(".comment-box").type("Comment-1{enter}");
        // cy.toastWait('Comment added successfully')
        cy.getActiveModal().find(".mdi-door-open").click();

        cy.get("body")
            .contains(validationString, { timeout: 2000 })
            .should("exist");
    }

    cy.getActiveModal()
        .find("button")
        .contains("Cancel")
        .should("exist")
        .click();
    cy.get("body").type("{esc}");
}

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

    // Download CSV
    let actionsMenuItemsCnt = 2;

    cy.openTableTab(columnName, 25);

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

    // validate if Share button is visible at header tool bar
    cy.get("header.v-toolbar")
        .eq(0)
        .find('button:contains("Share")')
        .should(validationString);

    // Owner, Creator will have two navigation drawer (on each side of center panel)
    if (roleType == "owner" || roleType == "creator") {
        navDrawListCnt = 3;
        // Download CSV / Upload CSV / Shared View List / Webhook
        actionsMenuItemsCnt = 5;
    } else if (roleType == "editor") {
        // Download CSV / Upload CSV
        actionsMenuItemsCnt = 3;
    }

    cy.get(".v-navigation-drawer__content")
        .eq(1)
        .find('[role="list"]')
        .should("have.length", navDrawListCnt);

    // 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-gallery-view`).should(validationString);
    cy.get(`.nc-create-grid-view`).should(validationString);
    cy.get(`.nc-create-form-view`).should(validationString);

    // share view & automations, exists only for owner/creator
    // cy.get(`.nc-share-view`).should(validationString);
    // cy.get(`.nc-automations`).should(validationString);
    // mainPage.shareView().should(validationString);
    // mainPage.automations().should(validationString);

    // share view permissions are role specific
    cy.get(".nc-btn-share-view").should(validationString);

    // actions menu (more), only download csv should be visible for non-previlaged users
    cy.get(".nc-actions-menu-btn").click();
    cy.getActiveMenu()
        .find('[role="menuitem"]')
        .should("have.length", actionsMenuItemsCnt);
}

export function _topRightMenu(roleType, previewMode) {
    // 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-topright-menu").find(".nc-menu-share").should(validationString);

    // cy.get(".nc-topright-menu").find(".nc-menu-theme").should("exist");
    // cy.get(".nc-topright-menu").find(".nc-menu-dark-theme").should("exist");
    cy.get(".nc-topright-menu").find(".nc-menu-translate").should("exist");
    cy.get(".nc-topright-menu").find(".nc-menu-account").should("exist");
    // cy.get(".nc-topright-menu").find(".nc-menu-alert").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");
    cy.get(".nc-acl-save").next().click({ force: true });
    cy.toastWait("Updated UI ACL for tables successfully");
}

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");
    cy.get(".nc-acl-save").next().click({ force: true });
    cy.toastWait("Updated UI ACL for tables successfully");
}

export function _accessControl(roleType, previewMode) {
    let validationString = roleType == "creator" ? "exist" : "not.exist";
    cy.get(".nc-project-tree")
        .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
        .should("exist")
        .first()
        .click({ force: true });

    cy.get(".nc-project-tree")
        .contains("Language", { timeout: 6000 })
        .should(validationString);

    cy.get(".nc-project-tree")
        .contains("CustomerList", { timeout: 6000 })
        .should(validationString);

    cy.get(".nc-project-tree")
        .find(".v-list-item__title:contains(Tables)", { timeout: 10000 })
        .first()
        .click({ force: true });
}
