package io.vertx.ext.unit.report;

import io.vertx.codegen.annotations.DataObject;
import io.vertx.codegen.annotations.Fluent;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.util.ArrayList;
import java.util.List;

/**
 * Reporting options:
 *
 * <ul>
 *   <li>the {@code reporters} is an array of reporter configurations</li>
 * </ul>
 *
 * @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
 */
@DataObject(generateConverter = true)
public class ReportingOptions {

  private List<ReportOptions> reporters = new ArrayList<>();

  /**
   * Create a new empty options, with the default address out and no reporters.
   */
  public ReportingOptions() {
  }

  /**
   * Copy constructor.
   *
   * @param other the options to copy
   */
  public ReportingOptions(ReportingOptions other) {
    other.reporters.stream().
        map(ReportOptions::new).
        forEach(reporters::add);
  }

  /**
   * Create a new options from the specified json.
   *
   * @param json the json to create from
   */
  public ReportingOptions(JsonObject json) {
    ReportingOptionsConverter.fromJson(json, this);
  }

  /**
   * @return the current reporters options
   */
  public List<ReportOptions> getReporters() {
    return reporters;
  }

  /**
   * Add a reporter to the current list.
   *
   * @param reportOptions the options of the reporter to use
   * @return a reference to this, so the API can be used fluently
   */
  @Fluent
  public ReportingOptions addReporter(ReportOptions reportOptions) {
    reporters.add(reportOptions);
    return this;
  }

  /**
   * Replace the current list of reporters with a new one.
   *
   * @param reporters the new reporters
   * @return a reference to this, so the API can be used fluently
   */
  @Fluent
  public ReportingOptions setReporters(List<ReportOptions> reporters) {
    this.reporters = reporters;
    return this;
  }

  /**
   * @return the json modelling the current configuration
   */
  public JsonObject toJson() {
    JsonObject json = new JsonObject();
    ReportingOptionsConverter.toJson(this, json);
    return json;
  }
}
