package io.vertx.redis.op;

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

@DataObject
public class BitFieldOptions {

  private BitFieldGetCommand get;
  private BitFieldSetCommand set;
  private BitFieldIncrbyCommand incrby;

  public BitFieldOptions() {
  }

  public BitFieldOptions(BitFieldOptions obj) {
    get = obj.get;
    set = obj.set;
    incrby = obj.incrby;
  }

  public BitFieldOptions(JsonObject obj) {
    if (obj.containsKey("get")) {
      get = new BitFieldGetCommand(obj.getJsonObject("get"));
    }
    if (obj.containsKey("set")) {
      set = new BitFieldSetCommand(obj.getJsonObject("set"));
    }
    if (obj.containsKey("incrby")) {
      incrby = new BitFieldIncrbyCommand(obj.getJsonObject("incrby"));
    }
  }

  public BitFieldGetCommand getGet() {
    return get;
  }

  public void setGet(BitFieldGetCommand get) {
    this.get = get;
  }

  public BitFieldSetCommand getSet() {
    return set;
  }

  public void setSet(BitFieldSetCommand set) {
    this.set = set;
  }

  public BitFieldIncrbyCommand getIncrby() {
    return incrby;
  }

  public void setIncrby(BitFieldIncrbyCommand incrby) {
    this.incrby = incrby;
  }

  public JsonObject toJson() {
    return new JsonObject()
      .put("get", get.toJson())
      .put("set", set.toJson())
      .put("incrby", incrby.toJson());
  }

  public JsonArray toJsonArray() {
    final JsonArray array = new JsonArray();

    if (get != null) {
      array.add("GET").add(get.getType()).add(get.getOffset());
    }

    if (set != null) {
      array.add("SET").add(set.getType()).add(set.getOffset()).add(set.getValue());
    }

    if (incrby != null) {
      array.add("INCRBY").add(incrby.getType()).add(incrby.getOffset()).add(incrby.getIncrement());
    }

    return array;
  }
}