'use strict';

const {
  TraceSigintWatchdog
} = internalBinding('watchdog');

class SigintWatchdog extends TraceSigintWatchdog {
  _started = false;
  _effective = false;
  _onNewListener = (eve) => {
    if (eve === 'SIGINT' && this._effective) {
      super.stop();
      this._effective = false;
    }
  };
  _onRemoveListener = (eve) => {
    if (eve === 'SIGINT' && process.listenerCount('SIGINT') === 0 &&
        !this._effective) {
      super.start();
      this._effective = true;
    }
  }

  start() {
    if (this._started) {
      return;
    }
    this._started = true;
    // Prepend sigint newListener to remove stop watchdog before signal wrap
    // been activated. Also make sigint removeListener been ran after signal
    // wrap been stopped.
    process.prependListener('newListener', this._onNewListener);
    process.addListener('removeListener', this._onRemoveListener);

    if (process.listenerCount('SIGINT') === 0) {
      super.start();
      this._effective = true;
    }
  }

  stop() {
    if (!this._started) {
      return;
    }
    this._started = false;
    process.removeListener('newListener', this._onNewListener);
    process.removeListener('removeListener', this._onRemoveListener);

    if (this._effective) {
      super.stop();
      this._effective = false;
    }
  }
}


module.exports = {
  SigintWatchdog
};
