/*
 * 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.compiler

import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.MessageRenderer
import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.config.Services
import java.io.File

@Suppress("unused")
class BazelK2JVMCompiler(private val delegate: K2JVMCompiler = K2JVMCompiler()) {
    private fun createArgs(args: Array<out String>): K2JVMCompilerArguments {
        var friendsPaths: Array<String>? = null

        val tally = mutableListOf<String>()
        var i = 0
        do {
            when {
            // https://github.com/bazelbuild/rules_kotlin/issues/69: remove once jetbrains adds a flag for it.
                args[i].startsWith("--friend-paths") -> {
                    i++
                    friendsPaths = args[i].split(File.pathSeparator).toTypedArray()
                }
                else -> tally += args[i]
            }
            i++
        } while (i < args.size)

        return delegate.createArguments().also {
            delegate.parseArguments(tally.toTypedArray(), it)
            if (friendsPaths != null) {
                it.friendPaths = friendsPaths
            }
        }
    }

    fun exec(errStream: java.io.PrintStream, vararg args: kotlin.String): ExitCode {
        val arguments = createArgs(args)
        val collector = PrintingMessageCollector(errStream, MessageRenderer.PLAIN_RELATIVE_PATHS, arguments.verbose)
        return delegate.exec(collector, Services.EMPTY, arguments)
    }
}