import '../../utils/dismiss-local-backup';
import {
  login,
  createPostAndExit,
  updateExistingPostAndExit,
  goToWorkflow,
  deleteWorkflowEntry,
  updateWorkflowStatus,
  publishWorkflowEntry,
} from '../../utils/steps';
import { workflowStatus } from '../../utils/constants';
import { entry1, entry2 } from './entries';

export default function({ use_graphql }) {
  let taskResult = { data: {} };

  const backend = 'github';

  before(() => {
    Cypress.config('taskTimeout', 1200000);
    Cypress.config('defaultCommandTimeout', 60000);
    cy.task('setupBackend', { backend }).then(data => {
      taskResult.data = data;
    });
    cy.task('updateBackendOptions', { backend, options: { use_graphql, open_authoring: true } });
  });

  after(() => {
    cy.task('teardownBackend', { backend, ...taskResult.data });
    cy.task('restoreDefaults');
  });

  afterEach(() => {
    cy.task('teardownBackendTest', { backend, ...taskResult.data });
  });

  it('successfully loads', () => {
    login(taskResult.data.user);
  });

  it('can create an entry', () => {
    login(taskResult.data.user);
    createPostAndExit(entry1);
  });

  it('can update an entry', () => {
    login(taskResult.data.user);
    createPostAndExit(entry1);
    updateExistingPostAndExit(entry1, entry2);
  });

  it('can publish an editorial workflow entry', () => {
    login(taskResult.data.user);
    createPostAndExit(entry1);
    goToWorkflow();
    updateWorkflowStatus(entry1, workflowStatus.draft, workflowStatus.ready);
    publishWorkflowEntry(entry1);
  });

  it('successfully forks repository and loads', () => {
    login(taskResult.data.forkUser);
  });

  it('can create an entry on fork', () => {
    login(taskResult.data.forkUser);
    createPostAndExit(entry1);
  });

  it('can update a draft entry on fork', () => {
    login(taskResult.data.user);
    createPostAndExit(entry1);
    updateExistingPostAndExit(entry1, entry2);
  });

  it('can change entry status from fork', () => {
    login(taskResult.data.forkUser);
    createPostAndExit(entry1);
    goToWorkflow();
    updateWorkflowStatus(entry1, workflowStatus.draft, workflowStatus.review);
  });

  it('can delete review entry from fork', () => {
    login(taskResult.data.forkUser);
    createPostAndExit(entry1);
    goToWorkflow();
    updateWorkflowStatus(entry1, workflowStatus.draft, workflowStatus.review);
    deleteWorkflowEntry(entry1);
  });

  it('can return entry to draft and delete it', () => {
    login(taskResult.data.forkUser);
    createPostAndExit(entry1);
    goToWorkflow();
    updateWorkflowStatus(entry1, workflowStatus.draft, workflowStatus.review);

    updateWorkflowStatus(entry1, workflowStatus.review, workflowStatus.draft);
    deleteWorkflowEntry(entry1);
  });
}