/*
 * Copyright 2009 Google Inc.
 *
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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.
 */
package com.google.gwt.dev.util.arg;

import com.google.gwt.dev.js.JsNamespaceOption;
import com.google.gwt.util.tools.ArgHandlerFlag;

/**
 * Compiles quickly with minimal optimizations.
 */
public class ArgHandlerDraftCompile extends ArgHandlerFlag {

  private final OptionOptimize optimizeOption;
  private final OptionClusterSimilarFunctions clusterSimilarFunctionsOption;
  private final OptionInlineLiteralParameters inlineLiteralParametersOption;
  private final OptionNamespace namespaceOption;
  private final OptionOptimizeDataflow optimizeDataflowOption;
  private final OptionOrdinalizeEnums ordinalizeEnumsOption;
  private final OptionRemoveDuplicateFunctions removeDuplicateFunctionsOption;

  public <
      T extends OptionOptimize & OptionClusterSimilarFunctions &
          OptionInlineLiteralParameters & OptionOptimizeDataflow &
          OptionOrdinalizeEnums & OptionRemoveDuplicateFunctions & OptionNamespace>
          ArgHandlerDraftCompile(T option) {
    this.optimizeOption = option;
    this.clusterSimilarFunctionsOption = option;
    this.inlineLiteralParametersOption = option;
    this.namespaceOption = option;
    this.optimizeDataflowOption = option;
    this.ordinalizeEnumsOption = option;
    this.removeDuplicateFunctionsOption = option;
  }

  @Override
  public String getPurposeSnippet() {
    return "Compile quickly with minimal optimizations.";
  }

  @Override
  public String getLabel() {
    return "draftCompile";
  }

  @Override
  public boolean setFlag(boolean value) {
    int optimizeLevel =
        value ? OptionOptimize.OPTIMIZE_LEVEL_DRAFT : OptionOptimize.OPTIMIZE_LEVEL_DEFAULT;
    optimizeOption.setOptimizationLevel(optimizeLevel);

    clusterSimilarFunctionsOption.setClusterSimilarFunctions(!value);
    inlineLiteralParametersOption.setInlineLiteralParameters(!value);
    namespaceOption.setNamespace(JsNamespaceOption.PACKAGE);
    if (value) {
      optimizeDataflowOption.setOptimizeDataflow(false);
    }
    ordinalizeEnumsOption.setOrdinalizeEnums(!value);
    removeDuplicateFunctionsOption.setRemoveDuplicateFunctions(!value);

    return true;
  }

  @Override
  public boolean getDefaultValue() {
    return optimizeOption.getOptimizationLevel() == OptionOptimize.OPTIMIZE_LEVEL_DRAFT;
  }
}
