import {bindingBehavior} from 'aurelia-binding';
import {BindingSignaler} from './binding-signaler';

@bindingBehavior('signal')
export class SignalBindingBehavior {

  /**@internal */
  static inject() { return [BindingSignaler]; }
  signals;

  constructor(bindingSignaler) {
    this.signals = bindingSignaler.signals;
  }

  bind(binding, source, ...names) {
    if (!binding.updateTarget) {
      throw new Error('Only property bindings and string interpolation bindings can be signaled.  Trigger, delegate and call bindings cannot be signaled.');
    }
    let signals = this.signals;
    if (names.length === 1) {
      let name = names[0];
      let bindings = signals[name] || (signals[name] = []);
      bindings.push(binding);
      binding.signalName = name;
    } else if (names.length > 1) {
      let i = names.length;
      while (i--) {
        let name = names[i];
        let bindings = signals[name] || (signals[name] = []);
        bindings.push(binding);
      }
      binding.signalName = names;
    } else {
      throw new Error('Signal name is required.');
    }
  }

  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  unbind(binding, source) {
    let signals = this.signals;
    let name = binding.signalName;
    binding.signalName = null;
    if (Array.isArray(name)) {
      let names = name;
      let i = names.length;
      while (i--) {
        let n = names[i];
        let bindings = signals[n];
        bindings.splice(bindings.indexOf(binding), 1);
      }
    } else {
      let bindings = signals[name];
      bindings.splice(bindings.indexOf(binding), 1);
    }
  }
}
