const {
	device, expect, element, by, waitFor
} = require('detox');
const data = require('../data');

async function navigateToWorkspace() {
    await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(2000);
	await element(by.id('join-workspace')).tap();
	await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000);
	await element(by.id('new-server-view-input')).replaceText(data.server);
	await element(by.id('new-server-view-button')).tap();
	await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000);
	await expect(element(by.id('workspace-view'))).toBeVisible();
}

async function navigateToLogin() {
    await navigateToWorkspace();
	await element(by.id('workspace-view-login')).tap();
    await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000);
    await expect(element(by.id('login-view'))).toBeVisible();
}

async function navigateToRegister() {
    await navigateToWorkspace();
	await element(by.id('workspace-view-register')).tap();
    await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000);
    await expect(element(by.id('register-view'))).toBeVisible();
}

async function login() {
    await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000);
    await element(by.id('login-view-email')).replaceText(data.user);
    await element(by.id('login-view-password')).replaceText(data.password);
    await sleep(300);
    await element(by.id('login-view-submit')).tap();
    await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000);
}

async function logout() {
    await element(by.id('rooms-list-view-sidebar')).tap();
    await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000);
	await waitFor(element(by.id('sidebar-settings'))).toBeVisible().withTimeout(2000);
    await element(by.id('sidebar-settings')).tap();
    await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000);
    await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom');
    await element(by.id('settings-logout')).tap();
    const logoutAlertMessage = 'You will be logged out of this application.';
    await waitFor(element(by.text(logoutAlertMessage)).atIndex(0)).toExist().withTimeout(10000);
    await expect(element(by.text(logoutAlertMessage)).atIndex(0)).toExist();
    await element(by.text('Logout')).tap();
    await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000);
    await expect(element(by.id('onboarding-view'))).toBeVisible();
}

async function createUser() {
    await navigateToRegister();
    await element(by.id('register-view-name')).replaceText(data.user);
    await element(by.id('register-view-username')).replaceText(data.user);
    await element(by.id('register-view-email')).replaceText(data.email);
    await element(by.id('register-view-password')).replaceText(data.password);
    await sleep(300);
    await element(by.id('register-view-submit')).tap();
    await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(60000);
    await expect(element(by.id('rooms-list-view'))).toBeVisible();
}

async function tapBack() {
    await element(by.id('header-back')).atIndex(0).tap();
}

async function sleep(ms) {
    return new Promise(res => setTimeout(res, ms));
}

module.exports = {
    navigateToWorkspace,
    navigateToLogin,
    navigateToRegister,
    login,
    logout,
    createUser,
    tapBack,
    sleep
};