import { LoginPage } from '@admin-lib/index';
import { bookingData } from '@fixtures/travelxen/booking_data';
import { TravelXenInterceptApis } from '@travelxen-lib/api-intercept';
import { stagingUsers } from '@fixtures/staging-users';
import { User_Type } from '@support-onboard/index';
import { AdminInterceptsApis } from '@admin-lib/api-intercept';
import { TravelXenHomePage } from '@travelxen-lib/pages';

const { agentChat } = stagingUsers;
const agentCreds = Cypress.env('agent').AGENT_PASSWORD;

const selectors = {
  oktaLogin: 'input[type="text"]',
  oktaSubmit: 'input[data-type="save"]',
  oktaPassword: 'input[type="password"]',
  oktaSubmitPassword: 'input[data-type="save"]'
};

export const createBookingForTheCompany = () => {
  LoginPage.createHotelBookingForOnBoardingCompany(bookingData);
};

export const prepareTravelXenEnv = () => {
  LoginPage.createNewCompanyAndLoginWithUserByType({
    companySuffix: '-travelxen',
    users: [User_Type.ADMIN]
  });

  LoginPage.clearExistingLoginSession();
  AdminInterceptsApis.interceptAdminsApis();

  TravelXenInterceptApis.interceptTravelxenApis();
  TravelXenInterceptApis.interceptPaymentMethodsApis();
};

export const prepareTravelXenVIPEnv = () => {
  LoginPage.createNewCompanyAndLoginWithUserByType({
    companySuffix: '-travelxen',
    users: [User_Type.ADMIN],
    vip: true
  });
  createBookingForTheCompany();

  LoginPage.clearExistingLoginSession();
  AdminInterceptsApis.interceptAdminsApis();

  TravelXenInterceptApis.interceptTravelxenApis();
  TravelXenInterceptApis.interceptPaymentMethodsApis();
};

export const visitTravelxen = () => {
  cy.visit('/app/travelxen2');
};

export const visitAgentDesktop = () => {
  cy.visit(agentChat.oktaUrl);
  cy.get(selectors.oktaLogin).type(agentChat.email);
  cy.get(selectors.oktaSubmit).click();
  cy.get(selectors.oktaPassword).type(agentCreds, { log: false });
  cy.get(selectors.oktaSubmitPassword).click();
  cy.intercept('GET', /api\/chat\/v1\/agent\/workers/).as('agentLogin');
  loginToTwilio();
  cy.wait('@agentLogin');
  cy.wait(['@getSplits', '@getAgencies', '@getDropdownOptions']);
};

export const getLastMessageInView = () => {
  return cy.get('[data-testid="chat-message"]').last();
};

const loginToTwilio = () => {
  cy.window().then((win) => {
    cy.stub(win, 'open')
      .as('popup')
      .callsFake((url) => {
        win.location.href = url;
      });
  });
};
export const openCreatedUserDetails = () => {
  TravelXenHomePage.retrieveCreatedUserAndSearchByEmail();
  TravelXenHomePage.selectUserFromSearchResult();
};

export const openCreatedBookingDetails = () => {
  TravelXenHomePage.retrieveCreatedBookingAndSearchById();
  TravelXenHomePage.selectBookingFromSearchResult();
};
