import { skipIfInspectorDisabled } from '../common/index.mjs';

skipIfInspectorDisabled();

import * as fixtures from '../common/fixtures.mjs';
import startCLI from '../common/debugger.js';

import assert from 'assert';
import { spawn } from 'child_process';

// NOTE(oyyd): We might want to import this regexp from "lib/_inspect.js"?
const kDebuggerMsgReg = /Debugger listening on ws:\/\/\[?(.+?)\]?:(\d+)\//;

function launchTarget(...args) {
  const childProc = spawn(process.execPath, args);
  return new Promise((resolve, reject) => {
    const onExit = () => {
      reject(new Error('Child process exits unexpectedly'));
    };
    childProc.on('exit', onExit);
    childProc.stderr.setEncoding('utf8');
    let data = '';
    childProc.stderr.on('data', (chunk) => {
      data += chunk;
      const ret = kDebuggerMsgReg.exec(data);
      childProc.removeListener('exit', onExit);
      if (ret) {
        resolve({
          childProc,
          host: ret[1],
          port: ret[2],
        });
      }
    });
  });
}

{
  const script = fixtures.path('debugger/alive.js');
  let cli = null;
  let target = null;

  function cleanup(error) {
    if (cli) {
      cli.quit();
      cli = null;
    }
    if (target) {
      target.kill();
      target = null;
    }
    assert.ifError(error);
  }

  try {
    const { childProc, host, port } = await launchTarget('--inspect=0', script);
    target = childProc;
    cli = startCLI([`${host || '127.0.0.1'}:${port}`]);
    await cli.waitForPrompt();
    await cli.command('sb("alive.js", 3)');
    await cli.waitFor(/break/);
    await cli.waitForPrompt();
    assert.match(
      cli.output,
      /> 3 {3}\+\+x;/,
      'marks the 3rd line'
    );
  } finally {
    cleanup();
  }
}
