import "cypress-plugin-snapshots/commands";
import * as jwt from "jsonwebtoken";

// https://docs.cypress.io/guides/testing-strategies/auth0-authentication#Custom-Command-for-Auth0-Authentication
// Adapted and simplified by a lot though!
Cypress.Commands.add("logInAs", (username) => {
  if (username !== "dti-test") {
    throw new Error(`Cypress can only log in as dti-test right now`);
  }
  const password = Cypress.env("DTI_TEST_USER_PASSWORD");

  const client_id = Cypress.env("AUTH0_TEST_CLIENT_ID");
  const client_secret = Cypress.env("AUTH0_TEST_CLIENT_SECRET");
  const audience = "https://impress-2020.openneo.net/api";
  const scope = "";

  // TODO: This grant doesn't seem to include the custom username field. The
  //       app is generally resilient to that, but yeah, it means the username
  //       might not show up in the global header UI during these tests.
  cy.request({
    method: "POST",
    url: `https://openneo.us.auth0.com/oauth/token`,
    body: {
      grant_type: "password",
      username,
      password,
      audience,
      scope,
      client_id,
      client_secret,
    },
  }).then(({ body }) => {
    const decodedUser = jwt.decode(body.access_token);

    const auth0Cypress = {
      encodedToken: body.access_token,
      decodedUser,
    };

    window.localStorage.setItem("auth0Cypress", JSON.stringify(auth0Cypress));
  });
});