/*
 * Copyright 2018 The Bazel Authors. All rights reserved.
 *
 * 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 io.bazel.kotlin.builder;

import dagger.BindsInstance;
import dagger.Component;
import dagger.Provides;
import io.bazel.kotlin.builder.tasks.BazelWorker;
import io.bazel.kotlin.builder.tasks.KotlinBuilder;
import io.bazel.kotlin.builder.tasks.js.Kotlin2JsTaskExecutor;
import io.bazel.kotlin.builder.tasks.jvm.KotlinJvmTaskExecutor;
import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
import io.bazel.kotlin.builder.utils.KotlinCompilerPluginArgsEncoder;

import javax.inject.Singleton;
import java.io.PrintStream;

@Singleton
@dagger.Component(modules = {KotlinBuilderComponent.Module.class})
public interface KotlinBuilderComponent {
  KotlinToolchain toolchain();

  KotlinJvmTaskExecutor jvmTaskExecutor();

  Kotlin2JsTaskExecutor jsTaskExecutor();

  BazelWorker worker();

  @Component.Builder
  interface Builder {
    @BindsInstance
    KotlinBuilderComponent.Builder toolchain(KotlinToolchain toolchain);

    KotlinBuilderComponent build();
  }

  @dagger.Module
  class Module {
    @Provides
    public KotlinCompilerPluginArgsEncoder providePluginArgEncoder(KotlinToolchain toolchain) {
      return new KotlinCompilerPluginArgsEncoder(
          toolchain.getKapt3Plugin().getJarPath(), toolchain.getKapt3Plugin().getId());
    }

    @Provides
    public PrintStream provideDebugPrintStream() {
      return System.err;
    }

    @Provides
    public BazelWorker provideWorker(KotlinBuilder builder) {
      return new BazelWorker(builder, System.err, "KotlinCompile");
    }
  }
}
