import { TEST_STUDENT1_USER_ID } from "../../consts";
import { login } from "../helpers";

describe("feedbackStudent.cy.js", () => {
  beforeEach(() => {
    cy.manageCommand("cypress_reset");
    login("test-student1@example.com", "test");
  });

  describe("Feedback UK", () => {
    beforeEach(() => {
      cy.visit("/course/test-lehrgang/learn/fahrzeug/feedback");
    });

    it("can open feedback page", () => {
      cy.testLearningContentTitle("Kursfeedback");
      cy.testLearningContentSubtitle("Feedback");
    });

    it("can create feedback by giving answers to all steps", () => {
      // initial wait for step 0 (or none with step==0) is required for pipelines
      cy.url().should((url) => {
        expect(url).to.match(/\/fahrzeug\/feedback(\?step=0)?$/);
      });

      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // fill feedback form
      // step 1
      cy.url().should("include", "step=1");
      cy.get('[data-cy="question-1"]').should(
        "contain",
        "Zufriedenheit insgesamt"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-4"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 2
      cy.url().should("include", "step=2");
      cy.get('[data-cy="question-2"]').should(
        "contain",
        "Zielerreichung insgesamt"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      // the system should store after every step -> check stored data
      cy.loadFeedbackResponse("feedback_user_id", TEST_STUDENT1_USER_ID).then(
        (ac) => {
          expect(ac.submitted).to.be.false;
          expect(ac.data.satisfaction).to.equal(4);
          expect(ac.data.instructor_competence).to.equal(null);
        }
      );
      cy.get('[data-cy="radio-3"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 3
      cy.url().should("include", "step=3");
      cy.get('[data-cy="question-3"]').should(
        "contain",
        "Wie beurteilst du deine Sicherheit bezüglichen den Themen nach dem Kurs?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-80"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 4
      cy.url().should("include", "step=4");
      cy.get('[data-cy="question-4"]').should(
        "contain",
        "Waren die Vorbereitungsaufträge klar und verständlich?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-false"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 5
      cy.url().should("include", "step=5");
      cy.get('[data-cy="question-5"]').should(
        "contain",
        "Wie beurteilst du die Themensicherheit und Fachkompetenz des Kursleiters/der Kursleiterin?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-2"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 6
      cy.url().should("include", "step=6");
      cy.get('[data-cy="question-6"]').should(
        "contain",
        "Wurden Fragen und Anregungen der Kursteilnehmenden ernst genommen und aufgegriffen?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-1"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 7
      cy.url().should("include", "step=7");
      cy.get('[data-cy="question-7"]').should(
        "contain",
        "Was möchtest du dem Kursleiter/der Kursleiterin sonst noch sagen?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="it-textarea-instructor_open_feedback"]').type(
        "Der Kursleiter ist eigentlich ganz nett."
      );
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 8
      cy.url().should("include", "step=8");
      cy.get('[data-cy="question-8"]').should(
        "contain",
        "Würdest du den Kurs weiterempfehlen?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-true"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 9
      cy.url().should("include", "step=9");
      cy.get('[data-cy="question-9"]').should(
        "contain",
        "Was hat dir besonders gut gefallen?"
      );

      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="it-textarea-course_positive_feedback"]').type(
        "Ich bin zufrieden mit den meisten Dingen."
      );
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 10
      cy.url().should("include", "step=10");
      cy.get('[data-cy="question-10"]').should(
        "contain",
        "Wo siehst du Verbesserungspotential?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="it-textarea-course_negative_feedback"]').type(
        "Ich bin unzufrieden mit einigen Sachen."
      );
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      cy.url().should("include", "step=11");
      cy.get('[data-cy="sendFeedbackButton"]').click();
      cy.get('[data-cy="complete-and-continue"]').click({ force: true });

      // marked complete in circle
      cy.url().should((url) => {
        expect(url).to.match(/\/fahrzeug#lu-transfer?$/);
      });
      cy.reload();
      cy.get(
        '[data-cy="test-lehrgang-lp-circle-fahrzeug-lc-feedback-checkbox"]'
      ).should("have.class", "cy-checked");

      // reopening page should get directly to last step
      cy.visit("/course/test-lehrgang/learn/fahrzeug/feedback");
      cy.url().should("include", "step=11");

      // check stored data
      cy.loadFeedbackResponse("feedback_user_id", TEST_STUDENT1_USER_ID).then(
        (ac) => {
          expect(ac.submitted).to.be.true;
          expect(ac.data).to.deep.equal({
            course_negative_feedback: "Ich bin unzufrieden mit einigen Sachen.",
            course_positive_feedback:
              "Ich bin zufrieden mit den meisten Dingen.",
            goal_attainment: 3,
            instructor_competence: 2,
            instructor_open_feedback:
              "Der Kursleiter ist eigentlich ganz nett.",
            instructor_respect: 1,
            preparation_task_clarity: false,
            proficiency: 80,
            satisfaction: 4,
            would_recommend: true,
            feedback_type: "uk",
          });
        }
      );
    });
  });

  describe("Feedback VV", () => {
    beforeEach(() => {
      cy.visit("/course/test-lehrgang/learn/reisen/feedback");
    });

    it("can open feedback page", () => {
      cy.testLearningContentTitle("Feedback");
      cy.testLearningContentSubtitle("Feedback");
    });

    it("can create feedback by giving answers to all steps", () => {
      // initial wait for step 0 (or none with step==0) is required for pipelines
      cy.url().should((url) => {
        expect(url).to.match(/\/reisen\/feedback(\?step=0)?$/);
      });
      cy.get('[data-cy="introduction"]').contains(
        "Wir bitten dich um dein Feedback. Es hilft uns, damit wir deine Lernerlebnisse verbessern können."
      );

      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // fill feedback form
      // step 1
      cy.url().should("include", "step=1");
      cy.get('[data-cy="question-1"]').should(
        "contain",
        "Zufriedenheit insgesamt"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-4"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 2
      cy.url().should("include", "step=2");
      cy.get('[data-cy="question-2"]').should(
        "contain",
        "Zielerreichung insgesamt"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      // the system should store after every step -> check stored data
      cy.loadFeedbackResponse("feedback_user_id", TEST_STUDENT1_USER_ID).then(
        (ac) => {
          expect(ac.submitted).to.be.false;
          expect(ac.data.satisfaction).to.equal(4);
          expect(ac.data.course_positive_feedback).to.equal(null);
        }
      );
      cy.get('[data-cy="radio-3"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 3
      cy.url().should("include", "step=3");
      cy.get('[data-cy="question-3"]').should(
        "contain",
        "Wie beurteilst du deine Sicherheit bezüglichen den Themen nach dem Circle?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-80"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 4
      cy.url().should("include", "step=4");
      cy.get('[data-cy="question-4"]').should(
        "contain",
        "Waren die Praxisaufträge klar und verständlich?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-false"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 5
      cy.url().should("include", "step=5");
      cy.get('[data-cy="question-5"]').should(
        "contain",
        "Würdest du den Circle weiterempfehlen?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="radio-false"]').click();
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 6
      cy.url().should("include", "step=6");
      cy.get('[data-cy="question-6"]').should(
        "contain",
        "Was hat dir besonders gut gefallen?"
      );

      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="it-textarea-course_positive_feedback"]').type(
        "Der Circle ist eigentlich ganz nett."
      );
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      // step 7
      cy.url().should("include", "step=7");
      cy.get('[data-cy="question-7"]').should(
        "contain",
        "Wo siehst du Verbesserungspotential?"
      );
      cy.get('[data-cy="next-step"]').should("be.disabled");
      cy.get('[data-cy="it-textarea-course_negative_feedback"]').type(
        "Ich bin unzufrieden mit einigen Sachen."
      );
      cy.wait(200);
      cy.learningContentMultiLayoutNextStep();
      cy.wait(200);

      cy.url().should("include", "step=8");
      cy.get('[data-cy="sendFeedbackButton"]').click();
      cy.get('[data-cy="complete-and-continue"]').click({ force: true });

      // marked complete in circle
      cy.url().should((url) => {
        expect(url).to.match(/\/reisen#lu-transfer-reflexion-feedback?$/);
      });
      cy.reload();
      cy.get(
        '[data-cy="test-lehrgang-lp-circle-reisen-lc-feedback-checkbox"]'
      ).should("have.class", "cy-checked");

      // reopening page should get directly to last step
      cy.visit("/course/test-lehrgang/learn/reisen/feedback");
      cy.url().should("include", "step=8");

      // check stored data
      cy.loadFeedbackResponse("feedback_user_id", TEST_STUDENT1_USER_ID).then(
        (ac) => {
          expect(ac.submitted).to.be.true;
          expect(ac.data).to.deep.equal({
            course_negative_feedback: "Ich bin unzufrieden mit einigen Sachen.",
            course_positive_feedback: "Der Circle ist eigentlich ganz nett.",
            goal_attainment: 3,
            preparation_task_clarity: false,
            proficiency: 80,
            satisfaction: 4,
            would_recommend: false,
            feedback_type: "vv",
          });
        }
      );
    });
  });
});
