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-group-item"]')
                  .first()
                  .invoke("attr", "data-label-type")
                  .then((label_type) => {
                    const parent = cy
                      .get('[data-cy="label-group-item"]')
                      .first();
                    cy.log("Label type", label_type);

                    switch (label_type) {
                      case "slider": {
                        // Clicking on the slider will set the value to about the middle where it clicks
                        parent
                          .get('[aria-roledescription="slider"]')
                          .first()
                          .click();

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

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

                        break;
                      }
                      case "radio": {
                        // Clicking on the slider will set the value to about the middle where it clicks
                        parent
                          .get('[aria-roledescription="radio-button"]')
                          .last()
                          .click();

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

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

                        break;
                      }
                    }
                  });

                break;
              }
              default:
                throw new Error(`Unexpected task type: ${type}`);
            }

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

export {};
