export class BlazeWidgetLabel {
  value: string;

  constructor(value: string) {
    this.value = value;
  }

  static singleLabel(label: string): BlazeWidgetLabel {
    return new BlazeWidgetLabel(label);
  }

  static mustInclude(...labels: Array<string | BlazeWidgetLabel>): BlazeWidgetLabel {
    const labelStrings = labels.map((v) =>
      v instanceof BlazeWidgetLabel ? v.toString() : v
    );
    return new BlazeWidgetLabel(`[and, ${labelStrings.join(', ')}]`);
  }

  static atLeastOneOf(...labels: Array<string | BlazeWidgetLabel>): BlazeWidgetLabel {
    const labelStrings = labels.map((v) =>
      v instanceof BlazeWidgetLabel ? v.toString() : v
    );
    return new BlazeWidgetLabel(`[or, ${labelStrings.join(', ')}]`);
  }

  mustInclude(...labels: Array<string | BlazeWidgetLabel>): BlazeWidgetLabel {
    return BlazeWidgetLabel.mustInclude(this, ...labels);
  }

  atLeastOneOf(...labels: Array<string | BlazeWidgetLabel>): BlazeWidgetLabel {
    return BlazeWidgetLabel.atLeastOneOf(this, ...labels);
  }

  toString(): string {
    return this.value;
  }
}

// Example usage:
const labelInstance: BlazeWidgetLabel = BlazeWidgetLabel.singleLabel('example');
