// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;

import static org.junit.Assert.assertNotNull;

import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import java.util.ArrayList;
import java.util.List;

public class KotlinTestParameters {

  private final int index;
  private final KotlinCompiler kotlinc;
  private final KotlinTargetVersion targetVersion;

  private KotlinTestParameters(
      KotlinCompiler kotlinc, KotlinTargetVersion targetVersion, int index) {
    this.index = index;
    this.kotlinc = kotlinc;
    this.targetVersion = targetVersion;
  }

  public KotlinCompiler getCompiler() {
    return kotlinc;
  }

  public KotlinTargetVersion getTargetVersion() {
    return targetVersion;
  }

  public boolean isFirst() {
    return index == 0;
  }

  public static Builder builder() {
    return new Builder();
  }

  @Override
  public String toString() {
    return kotlinc + "[target=" + targetVersion + "]";
  }

  public static class Builder {

    private KotlinCompiler[] compilers;
    private KotlinTargetVersion[] targetVersions;

    private Builder() {}

    public Builder withAllCompilers() {
      compilers = ToolHelper.getKotlinCompilers();
      return this;
    }

    public Builder withAllCompilersAndTargetVersions() {
      return withAllCompilers().withAllTargetVersions();
    }

    public Builder withCompiler(KotlinCompiler compiler) {
      compilers = new KotlinCompiler[] {compiler};
      return this;
    }

    public Builder withAllTargetVersions() {
      targetVersions = KotlinTargetVersion.values();
      return this;
    }

    public Builder withTargetVersion(KotlinTargetVersion targetVersion) {
      targetVersions = new KotlinTargetVersion[] {targetVersion};
      return this;
    }

    public KotlinTestParametersCollection build() {
      validate();
      List<KotlinTestParameters> testParameters = new ArrayList<>();
      int index = 0;
      for (KotlinCompiler kotlinc : compilers) {
        for (KotlinTargetVersion targetVersion : targetVersions) {
          testParameters.add(new KotlinTestParameters(kotlinc, targetVersion, index++));
        }
      }
      return new KotlinTestParametersCollection(testParameters);
    }

    private void validate() {
      assertNotNull(compilers);
      assertNotNull(targetVersions);
    }
  }
}
