import { click, find } from '@ember/test-helpers';

export function jobURL(job, path = '') {
  const id = job.get('plainId');
  const namespace = job.get('namespace.name') || 'default';
  let expectedURL = `/v1/job/${id}${path}`;
  if (namespace !== 'default') {
    expectedURL += `?namespace=${namespace}`;
  }
  return expectedURL;
}

export async function stopJob() {
  await click('[data-test-stop] [data-test-idle-button]');
  await click('[data-test-stop] [data-test-confirm-button]');
}

export async function startJob() {
  await click('[data-test-start] [data-test-idle-button]');
  await click('[data-test-start] [data-test-confirm-button]');
}

export function expectStartRequest(assert, server, job) {
  const expectedURL = jobURL(job);
  const request = server.pretender.handledRequests
    .filterBy('method', 'POST')
    .find((req) => req.url === expectedURL);

  const requestPayload = JSON.parse(request.requestBody).Job;

  assert.ok(request, 'POST URL was made correctly');
  assert.ok(
    requestPayload.Stop == null,
    'The Stop signal is not sent in the POST request'
  );
}

export async function expectError(assert, title) {
  assert.equal(
    find('[data-test-job-error-title]').textContent,
    title,
    'Appropriate error is shown'
  );
  assert.ok(
    find('[data-test-job-error-body]').textContent.includes('ACL'),
    'The error message mentions ACLs'
  );

  await click('[data-test-job-error-close]');
  assert.notOk(
    find('[data-test-job-error-title]'),
    'Error message is dismissable'
  );
}

export function expectDeleteRequest(assert, server, job) {
  const expectedURL = jobURL(job);

  assert.ok(
    server.pretender.handledRequests
      .filterBy('method', 'DELETE')
      .find((req) => req.url === expectedURL),
    'DELETE URL was made correctly'
  );
}
