/*
 * Copyright 2010 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.core.ext.linker;

import com.google.gwt.core.ext.Linker;
import com.google.gwt.core.linker.SoycReportLinker;

import java.util.List;

/**
 * Captures some metrics from the precompilation step.
 */
@Transferable
public class PrecompilationMetricsArtifact extends Artifact<PrecompilationMetricsArtifact> {

  private long elapsedMilliseconds;
  private final int permutationBase;
  private int[] permutationIds;
  private String[] finalTypeOracleTypes;
  private String[] referencedAstTypes;

  public PrecompilationMetricsArtifact(int permutationId) {
    this(SoycReportLinker.class, permutationId);
  }
  
  protected PrecompilationMetricsArtifact(Class<? extends Linker> linker, int permutationBase) {
    super(linker);
    this.permutationBase = permutationBase;
  }

  /**
   * @return the number of types referenced by the AST.
   */
  public String[] getAstTypes() {
    return referencedAstTypes;
  }

  /**
   * @return wall clock time elapsed since start of precompilation
   */
  public long getElapsedMilliseconds() {
    return elapsedMilliseconds;
  }

  /**
   * @return types all types referenced by type oracle after compiling the
   *        sources on the source path with JDT.
   */
  public String[] getFinalTypeOracleTypes() {
    return this.finalTypeOracleTypes;
  }

  /**
   * @return the first permutation Id associated with compiling this permutation.
   */
  public int getPermuationBase() {
    return permutationBase;
  }
  
  /**
   * @return the permutation ids associated with this precompilation. 
   */
  public int[] getPermutationIds() {
    return permutationIds;
  }  

  @Override
  public int hashCode() {
    return getName().hashCode();
  }

  /**
   * @param astTypes an array of types referenced by the Java AST.
   */
  public PrecompilationMetricsArtifact setAstTypes(String[] astTypes) {
    this.referencedAstTypes = astTypes;
    return this;
  }

  /**
   * @param elapsedMilliseconds wall clock time elapsed since start of
   *        precompilation
   */
  public PrecompilationMetricsArtifact setElapsedMilliseconds(long elapsedMilliseconds) {
    this.elapsedMilliseconds = elapsedMilliseconds;
    return this;
  }

  /**
   * @param types all types referenced by type oracle after compiling the
   *        sources on the source path with JDT.
   */
  public PrecompilationMetricsArtifact setFinalTypeOracleTypes(List<String> types) {
    this.finalTypeOracleTypes = types.toArray(new String[types.size()]);
    return this;
  }

  /**
   * @param ids the permutation ids associated with this precompilation. 
   */
  public PrecompilationMetricsArtifact setPermuationIds(int[] ids) {
    this.permutationIds = ids;
    return this;
  }    
  @Override
  protected int compareToComparableArtifact(PrecompilationMetricsArtifact o) {
    return getName().compareTo(o.getName());
  }

  @Override
  protected final Class<PrecompilationMetricsArtifact> getComparableArtifactType() {
    return PrecompilationMetricsArtifact.class;
  }

  private String getName() {
    return "PrecompilationMetricsArtifact-" + permutationBase;
  }
}
