/* eslint-disable import/no-extraneous-dependencies, no-console */
const atob = require('atob');
const { execSync } = require('child_process');
const { post } = require('request').defaults({ jar: true });
const { seedData } = require('./seed-data');

const baseUrl = process.env.CYPRESS_baseUrl || 'http://localhost:5000';

function seedDatabase(seedValues) {
  const request = seedValues.shift();
  const data = request.type === 'form' ? { formData: request.data } : { json: request.data };

  post(baseUrl + request.route, data, (err, response) => {
    const result = response ? response.statusCode : err;
    console.log('POST ' + request.route + ' - ' + result);
    if (seedValues.length) {
      seedDatabase(seedValues);
    }
  });
}

function startServer() {
  console.log('Starting the server...');

  execSync('docker-compose -p cypress build --build-arg skip_ds_deps=true', { stdio: 'inherit' });
  execSync('docker-compose -p cypress up -d', { stdio: 'inherit' });
  execSync('docker-compose -p cypress run server create_db', { stdio: 'inherit' });
}

function stopServer() {
  console.log('Stopping the server...');
  execSync('docker-compose -p cypress down', { stdio: 'inherit' });
}

function runCypressCI() {
  const {
    PERCY_TOKEN_ENCODED,
    CYPRESS_PROJECT_ID_ENCODED,
    CYPRESS_RECORD_KEY_ENCODED,
    CIRCLE_REPOSITORY_URL,
  } = process.env;

  if (CIRCLE_REPOSITORY_URL && CIRCLE_REPOSITORY_URL.includes('getredash/redash')) {
    if (PERCY_TOKEN_ENCODED) {
      process.env.PERCY_TOKEN = atob(`${PERCY_TOKEN_ENCODED}`);
    }
    if (CYPRESS_PROJECT_ID_ENCODED) {
      process.env.CYPRESS_PROJECT_ID = atob(`${CYPRESS_PROJECT_ID_ENCODED}`);
    }
    if (CYPRESS_RECORD_KEY_ENCODED) {
      process.env.CYPRESS_RECORD_KEY = atob(`${CYPRESS_RECORD_KEY_ENCODED}`);
    }
  }

  execSync(
    'docker-compose run cypress ./node_modules/.bin/percy exec -- ./node_modules/.bin/cypress run --record',
    { stdio: 'inherit' },
  );
}

const command = process.argv[2] || 'all';

switch (command) {
  case 'start':
    startServer();
    break;
  case 'db-seed':
    seedDatabase(seedData);
    break;
  case 'run':
    execSync('cypress run', { stdio: 'inherit' });
    break;
  case 'open':
    execSync('cypress open', { stdio: 'inherit' });
    break;
  case 'run-ci':
    runCypressCI();
    break;
  case 'stop':
    stopServer();
    break;
  case 'all':
    startServer();
    seedDatabase(seedData);
    execSync('cypress run', { stdio: 'inherit' });
    stopServer();
    break;
  default:
    console.log('Usage: npm run cypress [start|db-seed|open|run|stop]');
    break;
}

@@ -1877,16 +1877,23 @@
 cy exec 
+-t 300 
 -- ./nod

Update Percy network idle timeout (#3724)