import { e2e } from '../utils';
// Skipping due to race conditions with same old arch test e2e/dashboards-suite/dashboard-public-create.spec.ts
describe.skip('Public dashboards', () => {
  beforeEach(() => {
    e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD'));
  });

  it('Create a public dashboard', () => {
    // Opening a dashboard without template variables
    cy.intercept({
      pathname: '/api/ds/query',
    }).as('query');
    e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' });
    cy.wait('@query');

    // Open sharing modal
    e2e.components.NavToolbar.shareDashboard().click();

    // Select public dashboards tab
    e2e.components.Tab.title('Public dashboard').click();

    // Create button should be disabled
    e2e.pages.ShareDashboardModal.PublicDashboard.CreateButton().should('be.disabled');

    // Create flow shouldn't show these elements
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlButton().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableAnnotationsSwitch().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableTimeRangeSwitch().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.PauseSwitch().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.DeleteButton().should('not.exist');

    // Acknowledge checkboxes
    e2e.pages.ShareDashboardModal.PublicDashboard.WillBePublicCheckbox().should('be.enabled').click({ force: true });
    e2e.pages.ShareDashboardModal.PublicDashboard.LimitedDSCheckbox().should('be.enabled').click({ force: true });
    e2e.pages.ShareDashboardModal.PublicDashboard.CostIncreaseCheckbox().should('be.enabled').click({ force: true });

    e2e.pages.ShareDashboardModal.PublicDashboard.CreateButton().should('be.enabled');

    // Create public dashboard
    cy.intercept('POST', '/api/dashboards/uid/ZqZnVvFZz/public-dashboards').as('save');
    e2e.pages.ShareDashboardModal.PublicDashboard.CreateButton().click();
    cy.wait('@save');

    // These elements shouldn't be rendered after creating public dashboard
    e2e.pages.ShareDashboardModal.PublicDashboard.WillBePublicCheckbox().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.LimitedDSCheckbox().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.CostIncreaseCheckbox().should('not.exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.CreateButton().should('not.exist');

    // These elements should be rendered
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlButton().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.PauseSwitch().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.DeleteButton().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.SettingsDropdown().should('exist');

    e2e.pages.ShareDashboardModal.PublicDashboard.SettingsDropdown().click();
    // There elements should be rendered once the Settings dropdown is opened
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableAnnotationsSwitch().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableTimeRangeSwitch().should('exist');
  });

  it('Open a public dashboard', () => {
    // Opening a dashboard without template variables
    cy.intercept({
      method: 'POST',
      pathname: '/api/ds/query',
    }).as('query');
    e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' });
    cy.wait('@query');

    // Tag indicating a dashboard is public
    e2e.pages.Dashboard.DashNav.publicDashboardTag().should('exist');

    // Open sharing modal
    e2e.components.NavToolbar.shareDashboard().click();

    // Select public dashboards tab
    cy.intercept('GET', '/api/dashboards/uid/ZqZnVvFZz/public-dashboards').as('query-public-dashboard');
    e2e.components.Tab.title('Public dashboard').click();
    cy.wait('@query-public-dashboard');

    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlButton().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.PauseSwitch().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.DeleteButton().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.SettingsDropdown().should('exist');

    e2e.pages.ShareDashboardModal.PublicDashboard.SettingsDropdown().click();
    // There elements should be rendered once the Settings dropdown is opened
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableTimeRangeSwitch().should('exist');
    e2e.pages.ShareDashboardModal.PublicDashboard.EnableAnnotationsSwitch().should('exist');

    // Make a request to public dashboards api endpoint without authentication
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput()
      .invoke('val')
      .then((url) => {
        cy.clearCookies()
          .request(getPublicDashboardAPIUrl(String(url)))
          .then((resp) => {
            expect(resp.status).to.eq(200);
          });
      });
  });

  it('Disable a public dashboard', () => {
    // Opening a dashboard without template variables
    cy.intercept({
      method: 'POST',
      pathname: '/api/ds/query',
    }).as('query');
    e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' });
    cy.wait('@query');

    // Open sharing modal
    e2e.components.NavToolbar.shareDashboard().click();

    // Select public dashboards tab
    cy.intercept('GET', '/api/dashboards/uid/ZqZnVvFZz/public-dashboards').as('query-public-dashboard');
    e2e.components.Tab.title('Public dashboard').click();
    cy.wait('@query-public-dashboard');

    // save url before disabling public dashboard
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput()
      .invoke('val')
      .then((text) => cy.wrap(text).as('url'));

    // Save public dashboard
    cy.intercept('PATCH', '/api/dashboards/uid/ZqZnVvFZz/public-dashboards/*').as('update');
    // Switch off enabling toggle
    e2e.pages.ShareDashboardModal.PublicDashboard.PauseSwitch().should('be.enabled').click({ force: true });
    cy.wait('@update');

    // Url should be hidden
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlInput().should('be.disabled');
    e2e.pages.ShareDashboardModal.PublicDashboard.CopyUrlButton().should('be.disabled');

    // Make a request to public dashboards api endpoint without authentication
    cy.get('@url').then((url) => {
      cy.clearCookies()
        .request({ url: getPublicDashboardAPIUrl(String(url)), failOnStatusCode: false })
        .then((resp) => {
          expect(resp.status).to.eq(403);
        });
    });
  });
});

const getPublicDashboardAPIUrl = (url: string): string => {
  let accessToken = url.split('/').pop();
  return `/api/public/dashboards/${accessToken}`;
};