import { faker } from "@faker-js/faker";

describe("handles random tasks", () => {
  it("completes the current task on submit and on request shows a new task", () => {
    cy.signInWithEmail("cypress@example.com");
    cy.visit("/tasks/random");

    // Do some tasks
    for (let taskNum = 0; taskNum < 10; taskNum++) {
      cy.get('[data-cy="task"]')
        .invoke("attr", "data-task-type")
        .then((type) => {
          cy.log("Task type", type);

          cy.get('[data-cy="task-id"]').then((taskIdElement) => {
            const taskId = taskIdElement.text();

            switch (type) {
              case "create-task": {
                const reply = faker.lorem.sentence();
                cy.log("reply", reply);
                cy.get('[data-cy="reply"]').type(reply);

                cy.get('[data-cy="review"]').click();

                cy.get('[data-cy="submit"]').click();
                break;
              }
              case "evaluate-task": {
                // Rank an item using the keyboard so that the submit button is enabled
                cy.get('[aria-roledescription="sortable"]')
                  .first()
                  .click()
                  .type("{enter}")
                  .wait(100)
                  .type("{downArrow}")
                  .wait(100)
                  .type("{enter}");

                cy.get('[data-cy="review"]').click();

                cy.get('[data-cy="submit"]').click();

                break;
              }
              case "label-task": {
                cy.get('[data-cy="label-options"]').each((label) => {
                  // Click the 4th option
                  cy.wrap(label).find('[data-cy="radio-option"]').eq(3).click();
                });

                cy.get('[data-cy="review"]').click();

                cy.get('[data-cy="submit"]').click();

                break;
              }
              case undefined: {
                throw new Error(
                  "No tasks available, but at least create initial prompt expected"
                );
              }
              default:
                throw new Error(`Unexpected task type: ${type}`);
            }

            cy.get('[data-cy="task-id"]').should((taskIdElement) => {
              expect(taskIdElement.text()).not.to.eq(taskId);
            });
          });
        });
    }
  });
});

export {};
