/*
 * Copyright (c) 2014, the Dart project authors.
 *
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 *
 * This file has been automatically generated.  Please do not edit it manually.
 * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
 */
package org.dartlang.analysis.server.protocol;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.dart.server.utilities.general.JsonUtilities;
import com.google.dart.server.utilities.general.ObjectUtilities;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.commons.lang3.StringUtils;

/**
 * A set of options controlling what kind of analysis is to be performed. If the value of a field
 * is omitted the value of the option will not be changed.
 *
 * @coverage dart.server.generated.types
 */
@SuppressWarnings("unused")
public class AnalysisOptions {

  public static final AnalysisOptions[] EMPTY_ARRAY = new AnalysisOptions[0];

  public static final List<AnalysisOptions> EMPTY_LIST = Lists.newArrayList();

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed async feature.
   */
  private final Boolean enableAsync;

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed deferred loading feature.
   */
  private final Boolean enableDeferredLoading;

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed enum feature.
   */
  private final Boolean enableEnums;

  /**
   * True if the client wants to enable support for the proposed "null aware operators" feature.
   */
  private final Boolean enableNullAwareOperators;

  /**
   * True if hints that are specific to dart2js should be generated. This option is ignored if
   * generateHints is false.
   */
  private final Boolean generateDart2jsHints;

  /**
   * True if hints should be generated as part of generating errors and warnings.
   */
  private final Boolean generateHints;

  /**
   * True if lints should be generated as part of generating errors and warnings.
   */
  private final Boolean generateLints;

  /**
   * Constructor for {@link AnalysisOptions}.
   */
  public AnalysisOptions(Boolean enableAsync, Boolean enableDeferredLoading, Boolean enableEnums, Boolean enableNullAwareOperators, Boolean generateDart2jsHints, Boolean generateHints, Boolean generateLints) {
    this.enableAsync = enableAsync;
    this.enableDeferredLoading = enableDeferredLoading;
    this.enableEnums = enableEnums;
    this.enableNullAwareOperators = enableNullAwareOperators;
    this.generateDart2jsHints = generateDart2jsHints;
    this.generateHints = generateHints;
    this.generateLints = generateLints;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj instanceof AnalysisOptions) {
      AnalysisOptions other = (AnalysisOptions) obj;
      return
        ObjectUtilities.equals(other.enableAsync, enableAsync) &&
        ObjectUtilities.equals(other.enableDeferredLoading, enableDeferredLoading) &&
        ObjectUtilities.equals(other.enableEnums, enableEnums) &&
        ObjectUtilities.equals(other.enableNullAwareOperators, enableNullAwareOperators) &&
        ObjectUtilities.equals(other.generateDart2jsHints, generateDart2jsHints) &&
        ObjectUtilities.equals(other.generateHints, generateHints) &&
        ObjectUtilities.equals(other.generateLints, generateLints);
    }
    return false;
  }

  public static AnalysisOptions fromJson(JsonObject jsonObject) {
    Boolean enableAsync = jsonObject.get("enableAsync") == null ? null : jsonObject.get("enableAsync").getAsBoolean();
    Boolean enableDeferredLoading = jsonObject.get("enableDeferredLoading") == null ? null : jsonObject.get("enableDeferredLoading").getAsBoolean();
    Boolean enableEnums = jsonObject.get("enableEnums") == null ? null : jsonObject.get("enableEnums").getAsBoolean();
    Boolean enableNullAwareOperators = jsonObject.get("enableNullAwareOperators") == null ? null : jsonObject.get("enableNullAwareOperators").getAsBoolean();
    Boolean generateDart2jsHints = jsonObject.get("generateDart2jsHints") == null ? null : jsonObject.get("generateDart2jsHints").getAsBoolean();
    Boolean generateHints = jsonObject.get("generateHints") == null ? null : jsonObject.get("generateHints").getAsBoolean();
    Boolean generateLints = jsonObject.get("generateLints") == null ? null : jsonObject.get("generateLints").getAsBoolean();
    return new AnalysisOptions(enableAsync, enableDeferredLoading, enableEnums, enableNullAwareOperators, generateDart2jsHints, generateHints, generateLints);
  }

  public static List<AnalysisOptions> fromJsonArray(JsonArray jsonArray) {
    if (jsonArray == null) {
      return EMPTY_LIST;
    }
    ArrayList<AnalysisOptions> list = new ArrayList<AnalysisOptions>(jsonArray.size());
    Iterator<JsonElement> iterator = jsonArray.iterator();
    while (iterator.hasNext()) {
      list.add(fromJson(iterator.next().getAsJsonObject()));
    }
    return list;
  }

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed async feature.
   */
  public Boolean getEnableAsync() {
    return enableAsync;
  }

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed deferred loading feature.
   */
  public Boolean getEnableDeferredLoading() {
    return enableDeferredLoading;
  }

  /**
   * Deprecated
   *
   * True if the client wants to enable support for the proposed enum feature.
   */
  public Boolean getEnableEnums() {
    return enableEnums;
  }

  /**
   * True if the client wants to enable support for the proposed "null aware operators" feature.
   */
  public Boolean getEnableNullAwareOperators() {
    return enableNullAwareOperators;
  }

  /**
   * True if hints that are specific to dart2js should be generated. This option is ignored if
   * generateHints is false.
   */
  public Boolean getGenerateDart2jsHints() {
    return generateDart2jsHints;
  }

  /**
   * True if hints should be generated as part of generating errors and warnings.
   */
  public Boolean getGenerateHints() {
    return generateHints;
  }

  /**
   * True if lints should be generated as part of generating errors and warnings.
   */
  public Boolean getGenerateLints() {
    return generateLints;
  }

  @Override
  public int hashCode() {
    HashCodeBuilder builder = new HashCodeBuilder();
    builder.append(enableAsync);
    builder.append(enableDeferredLoading);
    builder.append(enableEnums);
    builder.append(enableNullAwareOperators);
    builder.append(generateDart2jsHints);
    builder.append(generateHints);
    builder.append(generateLints);
    return builder.toHashCode();
  }

  public JsonObject toJson() {
    JsonObject jsonObject = new JsonObject();
    if (enableAsync != null) {
      jsonObject.addProperty("enableAsync", enableAsync);
    }
    if (enableDeferredLoading != null) {
      jsonObject.addProperty("enableDeferredLoading", enableDeferredLoading);
    }
    if (enableEnums != null) {
      jsonObject.addProperty("enableEnums", enableEnums);
    }
    if (enableNullAwareOperators != null) {
      jsonObject.addProperty("enableNullAwareOperators", enableNullAwareOperators);
    }
    if (generateDart2jsHints != null) {
      jsonObject.addProperty("generateDart2jsHints", generateDart2jsHints);
    }
    if (generateHints != null) {
      jsonObject.addProperty("generateHints", generateHints);
    }
    if (generateLints != null) {
      jsonObject.addProperty("generateLints", generateLints);
    }
    return jsonObject;
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("[");
    builder.append("enableAsync=");
    builder.append(enableAsync + ", ");
    builder.append("enableDeferredLoading=");
    builder.append(enableDeferredLoading + ", ");
    builder.append("enableEnums=");
    builder.append(enableEnums + ", ");
    builder.append("enableNullAwareOperators=");
    builder.append(enableNullAwareOperators + ", ");
    builder.append("generateDart2jsHints=");
    builder.append(generateDart2jsHints + ", ");
    builder.append("generateHints=");
    builder.append(generateHints + ", ");
    builder.append("generateLints=");
    builder.append(generateLints);
    builder.append("]");
    return builder.toString();
  }

}
