export class Label {
  constructor() {
    this._usedUpperLabels = [];
    this._usedLowerLabels = [];
  }
  draw(lower = false) {
    if (lower) {
      return this.pushLower();
    } else {
      return this.pushUpper();
    }
  }
  pushLower(label) {
    if (label == undefined) {
      label = this._generateLabel(this._usedLowerLabels.length + 1);
      while (this._usedLowerLabels.includes(this.label)) {
        label = this._generateLabel(this._usedLowerLabels.length + 1);
      }
    }
    this._usedLowerLabels.push(label);
    return label.toLowerCase();
  }
  pushUpper(label) {
    if (label == undefined) {
      label = this._generateLabel(this._usedUpperLabels.length + 1);
      while (this._usedUpperLabels.includes(this.label)) {
        label = this._generateLabel(this._usedUpperLabels.length + 1);
      }
    }
    this._usedUpperLabels.push(label);
    return label.toUpperCase();
  }
  _generateLabel(n) {
    let label = "";
    let labelNumber = n;
    while (labelNumber > 0) {
      const letterNumber = (labelNumber - 1) % 26;
      const currentLetter = String.fromCharCode(letterNumber + 65);
      label = currentLetter + label;
      labelNumber = (labelNumber - (letterNumber + 1)) / 26;
    }
    return label;
  }
}
export const label = new Label();