def run(env = {}, command)
  system(env, command) or raise "RAKE TASK FAILED: #{command}"
end

def has_xcodebuild
  system "which xcodebuild >/dev/null"
end

def xcode_action
  ENV["XCODE_ACTION"] || "build-for-testing test-without-building"
end

namespace "podspec" do
  desc "Run lint for podspec"
  task :lint do
    run "bundle exec pod lib lint --platforms=ios,tvos,macos"
  end
end

namespace "carthage" do
  desc "Build Carthage artifacts"
  task :build do
    run "carthage build --no-skip-current --use-xcframeworks --verbose"
  end
end

namespace "test" do
  desc "Run unit tests for all iOS targets"
  task :ios do |t|
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'generic/platform=iOS' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean build | xcpretty"
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'platform=iOS Simulator,name=iPhone 8' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean #{xcode_action} | xcpretty"
  end

  desc "Run unit tests for all tvOS targets"
  task :tvos do |t|
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'generic/platform=tvOS' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean build | xcpretty"
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'platform=tvOS Simulator,name=Apple TV' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean #{xcode_action} | xcpretty"
  end

  desc "Run unit tests for all macOS targets"
  task :macos do |t|
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean #{xcode_action} | xcpretty"
  end

  desc "Run unit tests for all macOS targets using static linking"
  task :macos_static do |t|
    run "set -o pipefail && MACH_O_TYPE=staticlib xcodebuild -workspace Quick.xcworkspace -scheme Quick OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean #{xcode_action} | xcpretty"
  end

  desc "Run unit tests for all visionOS targets"
  task :visionos do |t|
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'generic/platform=visionOS' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean build | xcpretty"
    run "set -o pipefail && xcodebuild -workspace Quick.xcworkspace -scheme Quick -destination 'platform=visionOS Simulator,name=Apple Vision Pro' OTHER_SWIFT_FLAGS='$(inherited) -suppress-warnings' clean #{xcode_action} | xcpretty"
  end

  desc "Run unit tests for the current platform built by the Swift Package Manager"
  task :swiftpm do |t|
    run "swift package clean && swift test -Xswiftc -suppress-warnings"
  end
end

namespace "templates" do
  install_dir = File.expand_path("~/Library/Developer/Xcode/Templates/File Templates/Quick")
  src_dir = File.expand_path("../Quick Templates", __FILE__)

  desc "Install Quick templates"
  task :install do
    if File.exists? install_dir
      raise "RAKE TASK FAILED: Quick templates are already installed at #{install_dir}"
    else
      mkdir_p install_dir
      cp_r src_dir, install_dir
    end
  end

  desc "Uninstall Quick templates"
  task :uninstall do
    rm_rf install_dir
  end
end

if has_xcodebuild then
  task default: ["test:ios", "test:tvos", "test:macos"]
else
  task default: ["test:swiftpm"]
end
