import { LoginHelper } from '../../helpers/login';

const invalidCredentialsMessage = 'Invalid username/password combination';

const loginHelper = new LoginHelper();

const goToRememberedMeState = () => {
  loginHelper.visitPageAndSubmitForm(
    'login/success-eula-accepted.xml',
    {
      status: 200,
      response: '@successResponse',
    }
  );
  // Assert URL to implicitly await until login submission finished
  cy.url().should('include', '/smart-sync');

  // Navigate back to login page
  cy.visit(loginHelper.route);
};

describe('Login page', () => {

  xit('Navigates to eula-message page when login is successful & EULA not accepted', () => {
    loginHelper.visitPageAndSubmitForm(
      'login/success-eula-not-accepted.xml',
      {
        status: 200,
        response: '@successResponse',
      }
    );
    cy.url().should('include', '/eula-message');
  });

  xit('Navigates to smart sync page when login is successful & EULA accepted', () => {
    loginHelper.visitPageAndSubmitForm(
      'login/success-eula-accepted.xml',
      {
        status: 200,
        response: '@successResponse',
      }
    );
    cy.url().should('include', '/smart-sync');
  });

  xit('Displays "invalid credentials" error when username/password incorrect', () => {
    loginHelper.visitPageAndSubmitForm(
      'login/unauthorised.xml',
      {
        status: 200,
        response: '@unauthenticatedResponse',
      }
    );
    loginHelper.elements.form.apiError().should('have.text', invalidCredentialsMessage);
  });

  xit('Displays invalid credentials error when companyId not found', () => {
    cy.server();
    // API should return 400 or 401 in this scenario but it actually returns
    // a 200 with an empty response body, so we simulate that here:
    loginHelper.visitPageAndSubmitForm(
      null,
      {
        status: 200,
        response: '',
      }
    );
    loginHelper.elements.form.apiError().should('have.text', invalidCredentialsMessage);
  });

  xit('Displays network failure error when API responds with 500 status code', () => {
    cy.server();
    loginHelper.visitPageAndSubmitForm(
      null,
      {
        status: 500,
        response: {},
      }
    );
    loginHelper.elements.form.apiError().should('have.text', 'Oops! Something has gone wrong');
  });

  // it('Prepopulates remembered companyId, username & displays reset button ', () => {
  //   goToRememberedMeState();
  //   loginHelper.elements.form.companyIdField()
  //     .should('have.value', loginHelper.formValues.companyId)
  //     .should('have.attr', 'readonly');
  //   loginHelper.elements.form.usernameField()
  //     .should('have.value', loginHelper.formValues.username)
  //     .should('have.attr', 'readonly');
  //   loginHelper.elements.form.resetButton().should('be.visible');
  // });

  xit('Resets companyId, username fields & hides Reset button when clicked', () => {
    goToRememberedMeState();
    loginHelper.elements.form.resetButton().click();
    loginHelper.elements.form.companyIdField()
      .should('have.value', '')
      .should('not.have.attr', 'readonly');
    loginHelper.elements.form.usernameField().should('have.value', '');
    loginHelper.elements.form.resetButton().should('not.be.visible');
    loginHelper.elements.form.companyIdField().should('not.have.attr', 'readonly')
  });

});
