// Copyright 2016 The Tulsi 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.

import Foundation


/// Provides methods to locate the default Bazel instance and Tulsi bazel files.
public struct BazelLocator {

  /// NSUserDefaults key for the default Bazel path if one is not found in the opened project's
  /// workspace.
  public static let DefaultBazelURLKey = "defaultBazelURL"

  public static var bazelURL: URL? {
    if let bazelURL = UserDefaults.standard.url(forKey: BazelLocator.DefaultBazelURLKey) {
      return bazelURL
    }

    // If no default set, check for bazel on the user's PATH.

    let semaphore = DispatchSemaphore(value: 0)
    var completionInfo: ProcessRunner.CompletionInfo?
    let task = TulsiProcessRunner.createProcess("/bin/bash",
                                                arguments: ["-l", "-c", "which bazel"]) {
                                                  processCompletionInfo in
                                                  defer { semaphore.signal() }
                                                  completionInfo = processCompletionInfo
    }
    task.launch()
    _ = semaphore.wait(timeout: DispatchTime.distantFuture)

    guard let info = completionInfo else {
      return nil
    }
    guard info.terminationStatus == 0 else {
      return nil
    }

    guard let stdout = String(data: info.stdout, encoding: String.Encoding.utf8) else {
      return nil
    }
    let bazelURL = URL(fileURLWithPath: stdout.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines),
                       isDirectory: false)
    guard FileManager.default.fileExists(atPath: bazelURL.path) else {
      return nil
    }

    UserDefaults.standard.set(bazelURL, forKey: BazelLocator.DefaultBazelURLKey)
    return bazelURL
  }

  public static func tulsiAspectsBzlPath(inWorkspace: Bool) -> String {
    return inWorkspace ? "//src/TulsiGenerator/Bazel:tulsi/tulsi_aspects.bzl" : "@tulsi//:tulsi/tulsi_aspects.bzl"
  }

  // MARK: - Private methods

  private init() {
  }
}
