// Copyright 2018 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
import XCTest
import TulsiGenerator

class BazelFakeWorkspace {
  let resourcesPathBase = "src/TulsiGeneratorIntegrationTests/Resources"
  var runfilesURL: URL
  var runfilesWorkspaceURL: URL
  var fakeExecroot: URL
  var workspaceRootURL: URL
  var bazelURL: URL
  var canaryBazelURL: URL?
  var pathsToCleanOnTeardown = Set<URL>()

  init(runfilesURL: URL, tempDirURL: URL) {
    self.runfilesURL = runfilesURL
    self.runfilesWorkspaceURL = runfilesURL.appendingPathComponent("__main__", isDirectory: true)
    self.fakeExecroot = tempDirURL.appendingPathComponent("fake_execroot", isDirectory: true)
    self.workspaceRootURL = fakeExecroot.appendingPathComponent("__main__", isDirectory: true)
    self.bazelURL = BazelLocator.bazelURL!
  }

  private func addExportsFiles(buildFilePath: String,
                               exportedFile: String) throws {
    try createDummyFile(path: "\(buildFilePath)/BUILD",
                        content: "exports_files([\"\(exportedFile)\"])\n")
  }

  private func addFilegroup(buildFilePath: String,
                            filegroup: String) throws {
    try createDummyFile(path: "\(buildFilePath)/BUILD",
                        content: """
filegroup(
    name = "\(filegroup)",
    visibility = ["//visibility:public"],
)
"""
    )
  }

  private func createDummyFile(path: String,
                               content: String) throws {
    let fileURL = workspaceRootURL.appendingPathComponent(path)
    let fileManager = FileManager.default
    let containingDirectory = fileURL.deletingLastPathComponent()
    if !fileManager.fileExists(atPath: containingDirectory.path) {
      try fileManager.createDirectory(at: containingDirectory,
                                      withIntermediateDirectories: true,
                                      attributes: nil)
    }
    if fileManager.fileExists(atPath: fileURL.path) {
      try fileManager.removeItem(at: fileURL)
    }
    try content.write(to: fileURL,
                      atomically: false,
                      encoding: String.Encoding.utf8)
  }

  private func installWorkspaceFile() {
    do {
      try FileManager.default.createDirectory(at: workspaceRootURL,
                                              withIntermediateDirectories: true,
                                              attributes: nil)

      do {
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: fakeExecroot.path) {
          try fileManager.removeItem(at: fakeExecroot)
        }
        try fileManager.copyItem(at: runfilesURL, to: fakeExecroot)
        pathsToCleanOnTeardown.insert(workspaceRootURL)
      } catch let e as NSError {
        XCTFail("Failed to copy workspace '\(runfilesURL)' to '\(workspaceRootURL)' for test. Error: \(e.localizedDescription)")
        return
      }
    } catch let e as NSError {
      XCTFail("Failed to create temp directory '\(workspaceRootURL.path)' for test. Error: \(e.localizedDescription)")
    }
  }

  func setup() -> BazelFakeWorkspace? {
    installWorkspaceFile()
    do {
      try createDummyFile(path: "tools/objc/objc_dummy.mm", content: "")
      try addExportsFiles(buildFilePath: "tools/objc", exportedFile: "objc_dummy.mm")
    } catch let e as NSError {
      XCTFail("Failed to set up fake workspace. Error: \(e.localizedDescription)")
    }
    return self
  }
}
