package eu.mulk.quarkus.googlecloud.jsonlogging;

import java.util.Objects;

/**
 * A label usable to tag a log message.
 *
 * <p>Instances of {@link Label} can be passed as log parameters to the {@code *f} family of logging
 * functions on {@link org.jboss.logging.Logger}.
 *
 * <p><strong>Example:</strong>
 *
 * <pre>{@code
 * logger.logf("Request rejected: unauthorized.", Label.of("requestId", "123"));
 * }</pre>
 *
 * Result:
 *
 * <pre>{@code
 * {
 *   "textPayload": "Request rejected: unauthorized.",
 *   "labels": {
 *     "requestId": "123"
 *   }
 * }
 * }</pre>
 *
 * @see KeyValueParameter
 * @see StructuredParameter
 */
public final class Label {

  private final String key;
  private final String value;

  private Label(String key, String value) {
    this.key = key;
    this.value = value;
  }

  /**
   * Constructs a {@link Label} from a key (i.e. name) and a value.
   *
   * <p>It is often useful for the key to be a {@link String} constant that is shared by multiple
   * parts of the program.
   *
   * @param key the key (name) of the label.
   * @param value the value of the label.
   * @return the newly constructed {@link Label}, ready to be passed to a logging function.
   */
  public static Label of(String key, String value) {
    return new Label(key, value);
  }

  /**
   * The name of the label.
   *
   * <p>It is often useful for this to be a {@link String} constant that is shared by multiple parts
   * of the program.
   *
   * @return the name of the label.
   */
  public String key() {
    return key;
  }

  /**
   * The value of the label.
   *
   * @return the value of the label.
   */
  public String value() {
    return value;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == this) return true;
    if (obj == null || obj.getClass() != this.getClass()) return false;
    var that = (Label) obj;
    return Objects.equals(this.key, that.key) && Objects.equals(this.value, that.value);
  }

  @Override
  public int hashCode() {
    return Objects.hash(key, value);
  }

  @Override
  public String toString() {
    return "Label[" + "key=" + key + ", " + "value=" + value + ']';
  }
}
