import logger from “./logger”

// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received. // Internal class, not intended for direct user manipulation.

class SubscriptionGuarantor {

constructor(subscriptions) {
  this.subscriptions = subscriptions
  this.pendingSubscriptions = []
}

guarantee(subscription) {
  if(this.pendingSubscriptions.indexOf(subscription) == -1){ 
    logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)
    this.pendingSubscriptions.push(subscription) 
  }
  else {
    logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)
  }
  this.startGuaranteeing()
}

forget(subscription) {
  logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)
  this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))
}

startGuaranteeing() {
  this.stopGuaranteeing()
  this.retrySubscribing()
}

stopGuaranteeing() {
  clearTimeout(this.retryTimeout)
}

retrySubscribing() {
  this.retryTimeout = setTimeout(() => {
    if (this.subscriptions && typeof(this.subscriptions.subscribe) === "function") {
      this.pendingSubscriptions.map((subscription) => {
        logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)
        this.subscriptions.subscribe(subscription)
      })
    }
  }
  , 500)
}

}

export default SubscriptionGuarantor